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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© TomZhou 中级黑马   /  2016-5-26 19:30  /  576 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.同步
        * 使用ReentrantLock类的lock()和unlock()方法进行同步
        * 2.通信
        * 使用ReentrantLock类的newCondition()方法可以获取Condition对象
        * 需要等待的时候使用Condition的await()方法, 唤醒的时候用signal()方法
        * 不同的线程使用不同的Condition, 这样就能区分唤醒的时候找哪个线程了
         */

        public static void main(String[] args) {
                final Print4 p = new Print4();
                new Thread() {
                        public void run() {
                                while (true) {
                                        try {
                                                p.print1();
                                        } catch (InterruptedException e) {
                                               
                                                e.printStackTrace();
                                        }
                                }
                        }
                }.start();
               
                new Thread() {
                        public void run() {
                                while (true) {
                                        try {
                                                p.print2();
                                        } catch (InterruptedException e) {
                                               
                                                e.printStackTrace();
                                        }
                                }
                        }
                }.start();
               
                new Thread() {
                        public void run() {
                                while (true) {
                                        try {
                                                p.print3();
                                        } catch (InterruptedException e) {
                                               
                                                e.printStackTrace();
                                        }
                                }
                        }
                }.start();
        }
}

class Print4 {
        private int flag = 1;
        private ReentrantLock r = new ReentrantLock();
        private Condition c1 = r.newCondition();
        private Condition c2 = r.newCondition();
        private Condition c3 = r.newCondition();
        public void print1() throws InterruptedException {
                r.lock();
                        while (flag != 1) {
                                c1.await();
                        }
                        System.out.println("1");
                        flag = 2;
                        c2.signal();
                r.unlock();
        }
       
        public void print2() throws InterruptedException {
                r.lock();
                        while (flag != 2) {
                                c2.await();
                        }               
                        System.out.println("2");
                        flag = 3;
                        c3.signal();
                r.unlock();
        }
       
        public void print3() throws InterruptedException {
                r.lock();
                        while (flag != 3) {
                                c3.await();
                        }
                        System.out.println("3");
                        flag = 1;
                        c1.signal();
                r.unlock();
        }
}

3 个回复

倒序浏览
看不懂啊,什么题目都没有
回复 使用道具 举报
java程序猿 来自手机 中级黑马 2016-9-14 08:29:26
藤椅
感谢楼主分享
回复 使用道具 举报
可以哦楼主
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马