黑马程序员技术交流社区

标题: 多线程问题 [打印本页]

作者: 杜加璇    时间: 2013-3-30 20:40
标题: 多线程问题
本帖最后由 杜加璇 于 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循环将是个死循环 那为什么还会执行呢?
求大神解释。
作者: 陈腾跃_2013    时间: 2013-3-30 21:41
能提供下main函数看看你是怎么调用printer类的吗?
你只是定义了同步函数,并不涉及Runnable的范畴呢!
作者: 李红志    时间: 2013-3-31 00:42
if 是分支语句 ;while是循环语句。分支语句要判断条件是否满足。
这个程序也不是随机执行的,因为初值是1,所以 (flag != 1)  的结果是false所以不执行 wait();而执行后面的语句即打印出传智播客,flag变成2,同理执行print2,print3.
若用while,道理也是一样的。


作者: 陈丽莉    时间: 2013-3-31 18:45
若还有问题,请继续追问~  没有的话,请将帖子分类改成【已解决】~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2