zoukankan      html  css  js  c++  java
  • Condition

    Condition


    Condition提供了一系列的方法来对阻塞和唤醒线程:

    1. await() :造成当前线程在接到信号或被中断之前一直处于等待状态。
    2. await(long time, TimeUnit unit) :造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
    3. awaitNanos(long nanosTimeout) :造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。返回值表示剩余时间,如果在nanosTimesout之前唤醒,那么返回值 = nanosTimeout - 消耗时间,如果返回值 <= 0 ,则可以认定它已经超时了。
    4. awaitUninterruptibly() :造成当前线程在接到信号之前一直处于等待状态。【注意:该方法对中断不敏感】。
    5. awaitUntil(Date deadline) :造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。如果没有到指定时间就被通知,则返回true,否则表示到了指定时间,返回返回false。
    6. signal():唤醒一个等待线程。该线程从等待方法返回前必须获得与Condition相关的锁。
    7. signal()All:唤醒所有等待线程。能够从等待方法返回的线程必须获得与Condition相关的锁。

    Condition与Object的监视器方法的对比

    201702060001

    用condition解决生产者消费者问题

    public class ConditionTest {
        private LinkedList<String> buffer;    //容器
        private int maxSize ;           //容器最大
        private Lock lock;
        private Condition fullCondition;
        private Condition notFullCondition;
    
        ConditionTest(int maxSize){
            this.maxSize = maxSize;
            buffer = new LinkedList<String>();
            lock = new ReentrantLock();
            fullCondition = lock.newCondition();
            notFullCondition = lock.newCondition();
        }
    
        public void set(String string) throws InterruptedException {
            lock.lock();    //获取锁
            try {
                while (maxSize == buffer.size()){
                    notFullCondition.await();       //满了,添加的线程进入等待状态,释放锁
                }
    
                buffer.add(string);
                fullCondition.signal();//添加了一个产品,容器不为空,唤醒一个等待线程
            } finally {
                lock.unlock();      //记得释放锁
            }
        }
    
        public String get() throws InterruptedException {
            String string;
            lock.lock();
            try {
                while (buffer.size() == 0){
                    fullCondition.await();
                }
                string = buffer.poll();
                notFullCondition.signal();
            } finally {
                lock.unlock();
            }
            return string;
        }
    }
    

    参考资料:

    http://cmsblogs.com/?p=2222

  • 相关阅读:
    网络技术全方位解析之三:RAID
    Linux系统安全隐患及加强安全管理的方法
    Silverlight 程序架构
    (转载)Qt:给QLineEdit加上一个搜索按钮
    (转载)StarUML启动时候出现"System Error. Code:1722. RPC服务器不可用."错误的解决办法
    (转载)starUML connect elements exactly
    (转载)Qt:拖拽图片到QLabel上并显示
    (转载)Qt:禁止qDebug的输出
    (转载)葱的营养价值和食用功效
    (转载)Qwt的安装与使用
  • 原文地址:https://www.cnblogs.com/fruitknife/p/9703126.html
Copyright © 2011-2022 走看看