Java多线程条件接口原理介绍

  

条件接口提供了类似对象的监视器方法,与锁配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的

  

癑ava多线程条件接口原理介绍"

  

<强>条件接口详解

  

条件定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到条件对象关联的锁.Condition对象是由锁对象(调用锁对象的newCondition()方法)创建出来的,换句话说,条件是依赖锁对象的。

        锁锁=新的ReentrantLock ();   条件条件=lock.newCondition ();   公共空间conditionWait()抛出InterruptedException {   lock.lock ();   尝试{   condition.await ();   最后}{   lock.unlock ();   }   }   公共空间conditionSignal()抛出InterruptedException {   lock.lock ();   尝试{   condition.signal ();   最后}{   lock.unlock ();   }   }      

一般都会将条件对象作为成员变量。当调用等待()方法后,当前线程会释放锁并在此等待,而其他线程调用条件对象的信号()方法,通知当前线程后,当前线程才从等待()方法返回,并且在返回前已经获取了锁。

     /* *   *当前线程进入等待状态直到被通知(信号)或中断,当前线程进入后台运行状态且从等待()方法返回   *其他线程调用该条件的信号或者signalAll方法,而当前线程被选中唤醒   * 1,其他线程(中断)中断当前线程   * 2,如果当前等待线程从等待方法返回,那么表明当前线程已经获取了条件对象的锁   */空白等待()抛出InterruptedException;/* *   *当前线程进入等待状态直到被通知,对中断不响应   */空白awaitUninterruptibly ();/* *   * & lt; pre>{@code   *布尔aMethod(长超时,TimeUnit unit) {   *长nano=unit.toNanos(超时);   * lock.lock ();   *{试   *虽然(! conditionBeingWaitedFor ()) {   *如果(nano & lt;=0 l)   *返回false;   * nano=theCondition.awaitNanos (nano);   *}   *//?   *}最后{   * lock.unlock ();   *}   *}}& lt;/pre>   *当前线程进入等待状态直到被通知,中断或超时。返回值表示剩余时间,如果在nanosTimeout纳秒之前被唤醒,那么返回值就是nanosTimeout——实际耗时   *返回值& lt;=0说明超时   *   */长awaitNanos(长nanosTimeout)抛出InterruptedException;/* *   *当前线程进入等待状态直到被通知,中断或超时,如果没有到指定时间被通知返回真,否则返回错误的   */布尔等待(长时间,TimeUnit unit)抛出InterruptedException;/* *   *唤醒一个等待在条件上的线程,该线程从等待方法返回之前必须获得与条件相关联的锁   */空白信号();   之前      

获取一个条件必须通过锁的newCondition()方法。下面通过一个有界队列的示例来深入了解条件的使用方式。

  

有界队列是一种特殊的队列,当队列为空时,队列的获取操作将会阻塞获取线程,直到队列中有新增元素,当队列已满时,队列的插入操作将会阻塞插入线程,直到队列出现“空位”

        公开课BoundedQueue{   私有对象[]项目;//添加的下标,删除的下标和数组当前数量   私人int addIndex removeIndex计数;   私人锁锁=新的ReentrantLock ();   私人条件notEmpty=lock.newCondition ();   私人条件notFull=lock.newCondition ();   公共BoundedQueue (int大小){   项=新对象(大小);   }/* *   *添加一个元素,如果数组满,则添加线程进入等待状态,直到有“空”位   * @author fuyuwei   * 2017年5月21日下午6:14:55   * @param t   * @throws InterruptedException   */公共空间添加(T T)抛出InterruptedException {   lock.lock ();   尝试{   而(count==items.length) {   notFull.await ();   }   项目[addIndex]=t;   如果(+ + addIndex==items.length)   addIndex=0;   + +计数;   notEmpty.signal ();   最后}{   lock.unlock ();   }   }/* *   *由头部删除一个元素,如果数组空,则删除线程进入等待状态,直到有新添加元素   * @author fuyuwei   * 2017年5月21日下午6:20:54   * @return   * @throws InterruptedException   */@SuppressWarnings (“unchecked”)   公共T remove()抛出InterruptedException {   lock.lock ();   尝试{   而(count==0)   notEmpty.await ();   对象x=物品(removeIndex);   如果(+ + removeIndex==items.length)   removeIndex=0;   ——数;   notFull.signal ();   返回x (T);   最后}{   lock.unlock ();   }   }   }   

Java多线程条件接口原理介绍