条件接口提供了类似对象的监视器方法,与锁配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的
<强>条件接口详解强>
条件定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到条件对象关联的锁.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多线程条件接口原理介绍