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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

本帖最后由 杜加璇 于 2013-4-5 18:06 编辑

class Printer {
        private int flag = 1;       
        private ReentrantLock lock = new ReentrantLock();       
        private Condition c1 = lock.newCondition();                       
        private Condition c2 = lock.newCondition();
        private Condition c3 = lock.newCondition();

        public void print1() throws Exception {                       
                lock.lock();
                if (flag != 1)       
                        c1.await();                       
                System.out.print("传");       
                System.out.print("智");       
                System.out.print("播");       
                System.out.print("客");       
                System.out.print("\r\n");       
                flag = 2;                       
                c2.signal();                               
                lock.unlock();
        }
       
        public void print2() throws Exception {
                lock.lock();
                if (flag != 2)       
                        c2.await();
                System.out.print("黑");       
                System.out.print("马");       
                System.out.print("程");       
                System.out.print("序");       
                System.out.print("员");       
                System.out.print("\r\n");
                flag = 3;                       
                c3.signal();
                lock.unlock();
        }
       
        public void print3() throws Exception {
                lock.lock();
                if (flag != 3)               
                        c3.await();
                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;                       
                c1.signal();               
                lock.unlock();
        }
       
}这个程序里都是指定唤醒线程1唤醒2 线程2唤醒3 线程3唤醒1  那这个if()判断不就没意义了吗为什么还要加上呢

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 最好用<>这个工具贴代码

查看全部评分

3 个回复

倒序浏览
这个问题我也想知道
回复 使用道具 举报
本帖最后由 赵家阳 于 2013-4-5 00:46 编辑

楼主:我先问你个问题,你这个类一没有继承Thread类,二没有实现Runnable接口,怎么开启多线程?如果你new三个对象,那么他们谁也无法干预另外的两个对象。
2,这个判断语句的作用还是蛮大的。加上去,他们就能按照一个顺序来回转。
如果没有加,前提是你用正确的方法开启了三个线程,在没有if语句的情况下,不管他们谁先运行,都会进入await();状态,谁也不会唤醒另外一个。
此时,这三个家伙,就只能等啊等啊等啊等啊等啊等啊等啊。。。。。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
class Printer {
        private int flag = 1;        
        private ReentrantLock lock = new ReentrantLock();        
        private Condition c1 = lock.newCondition();                        
        private Condition c2 = lock.newCondition();
        private Condition c3 = lock.newCondition();

        public void print1() throws Exception {                        
                lock.lock();
                if (flag != 1)        
                        c1.await();                        
                System.out.print("传");        
                System.out.print("智");        
                System.out.print("播");        
                System.out.print("客");        
                System.out.print("\r\n");        
                flag = 2;                        
                c2.signal();                                
                lock.unlock();
        }
        
        public void print2() throws Exception {
                lock.lock();
                if (flag != 2)        
                        c2.await();
                System.out.print("黑");        
                System.out.print("马");        
                System.out.print("程");        
                System.out.print("序");        
                System.out.print("员");        
                System.out.print("\r\n");
                flag = 3;                        
                c3.signal();
                lock.unlock();
        }
        
        public void print3() throws Exception {
                lock.lock();
                if (flag != 3)               
                        c3.await();
                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;                        
                c1.signal();               
                lock.unlock();
        }
        
}

如果没有if判断语句就会不分原由的进入等待状态,几个线程都会进入等待状态,如果加以判断就可以保证一个线程可以执行
就算其他线程拿到执行权因为数字不匹配就会进入等待状态。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马