A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜加璇 中级黑马   /  2013-3-30 20:40  /  1562 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜加璇 于 2013-3-31 19:11 编辑

class Printer {
        private int flag = 1;        

        public synchronized void print1() throws Exception {                        
                if (flag != 1)        
                        wait();
                System.out.print("传");        
                System.out.print("智");        
                System.out.print("播");        
                System.out.print("客");        
                System.out.print("\r\n");        
                flag = 2;                        
                notifyAll();                        
        }
        public synchronized void print2() throws Exception {
                if (flag != 2)        
                        wait();
                System.out.print("黑");        
                System.out.print("马");        
                System.out.print("程");        
                System.out.print("序");        
                System.out.print("员");        
                System.out.print("\r\n");
                flag = 3;                        
                notifyAll();                        
        }
        public synchronized void print3() throws Exception {
                if (flag != 3)               
                        wait();
                System.out.print("i");        
                System.out.print("t");        
                System.out.print("c");        
                System.out.print("a");        
                System.out.print("s");        
                System.out.print("t");        
                System.out.print("\r\n");
                flag = 1;                        
                notifyAll();                        
        }
        
}
这个程序为什么用if 是随机唤醒执行而用while是线程1,2,3 顺序唤醒执行呢?
假设用if时 先执行线程1 ,线程1唤醒线程3这时flag是2, 2!=3;线程3执行wait会继续沉睡,直到cpu切换到线程2时才会正常执行 ;同理线程2执行后,直到cpu切换到线程2时才会正常执行
照这个思路 用if时  会是按照线程1,2,3顺序执行的。而用while时也是假设先执行线程1 ,线程1唤醒线程3这时flag是2,那么线程3的while循环将是个死循环 那为什么还会执行呢?
求大神解释。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人加油

查看全部评分

3 个回复

倒序浏览
能提供下main函数看看你是怎么调用printer类的吗?
你只是定义了同步函数,并不涉及Runnable的范畴呢!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 25分咯~ 希望至少将这道题回答到底哦~.

查看全部评分

回复 使用道具 举报
if 是分支语句 ;while是循环语句。分支语句要判断条件是否满足。
这个程序也不是随机执行的,因为初值是1,所以 (flag != 1)  的结果是false所以不执行 wait();而执行后面的语句即打印出传智播客,flag变成2,同理执行print2,print3.
若用while,道理也是一样的。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问~  没有的话,请将帖子分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马