zoukankan      html  css  js  c++  java
  • Condition

    Lock,那是对synchronized的一种更为面向对象的替代,在原来的synchronized内部,我们可以调用object的wait与notify方法

    condition一方面是对lock功能的补充(也就是说,你用了lock,为了保证线程的通信,就得用condition)

    另一方面,synchronized的notifyall是唤醒所有等待的线程,那么如果有些线程我不想唤醒呢。

    下面的例子:主线程运行10次,然后子线程2运行20次,接着子线程3运行30次

    import java.util.concurrent.atomic.AtomicInteger;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class ThreeConditionCommunication {
    
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            final Business business = new Business();
            new Thread(
                    new Runnable() {
    
                        @Override
                        public void run() {
    
                            for (int i = 1; i <= 4; i++) {
                                business.sub2(i);
                            }
    
                        }
                    }
            ).start();
    
            new Thread(
                    new Runnable() {
    
                        @Override
                        public void run() {
    
                            for (int i = 1; i <= 4; i++) {
                                business.sub3(i);
                            }
    
                        }
                    }
            ).start();
    
            for (int i = 1; i <= 4; i++) {
                business.main(i);
            }
    
        }
    
    
        static class Business {
            Lock lock = new ReentrantLock();
            Condition condition1 = lock.newCondition();
            Condition condition2 = lock.newCondition();
            Condition condition3 = lock.newCondition();
            private int shouldSub = 1;
    
            public void sub2(int i) {
                lock.lock();
                try {
                    while (shouldSub != 2) {
                        try {
                            condition2.await();
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    for (int j = 1; j <= 20; j++) {
                        System.out.println("sub2 thread sequence of " + j + ",loop of " + i);
                    }
                    shouldSub = 3;
                    condition3.signal();
                } finally {
                    lock.unlock();
                }
            }
    
    
            public void sub3(int i) {
                lock.lock();
                try {
                    while (shouldSub != 3) {
                        try {
                            condition3.await();
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    for (int j = 1; j <= 30; j++) {
                        System.out.println("sub3 thread sequence of " + j + ",loop of " + i);
                    }
                    shouldSub = 1;
                    condition1.signal();
                } finally {
                    lock.unlock();
                }
            }
    
            public void main(int i) {
                lock.lock();
                try {
                    while (shouldSub != 1) {
                        try {
                            condition1.await();
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    for (int j = 1; j <= 10; j++) {
                        System.out.println("main thread sequence of " + j + ",loop of " + i);
                    }
                    shouldSub = 2;
                    condition2.signal();
                } finally {
                    lock.unlock();
                }
            }
    
        }
    }
  • 相关阅读:
    Chrome开发工具Elements面板(编辑DOM和CSS样式)详解
    Chrome调试大全
    横向子菜单栏ul根据其子元素li个数动态获取宽度,并与父li绝对垂直居中的jquery代码段
    IE6滤镜在实战测试中能让父层里面的子元素产生阴影
    导航栏项目滑过时子菜单显示/隐藏jquery代码
    IE6下完美兼容css3圆角和阴影属性的htc插件PIE.htc
    js函数对象
    兼容ie6及以上和firefox等标准浏览器的表格行滑过时背景色切换的效果
    对js原型对象的拓展和原型对象的重指向的区别的研究
    小结IE6的坑
  • 原文地址:https://www.cnblogs.com/tinya/p/8452791.html
Copyright © 2011-2022 走看看