使用Condition实现多路等待通知
一个锁内部可以有多个Condition,即有多路等待和通知,可参考JDK1.5的Lock和Condition实现的可阻塞队列的应用案例,在传统的线程机制中一个监视器对象上只能有一路等待和通知,要想实现多路等待和通知,必须嵌套使用多个同步监视器对象.
使用Condition可简单实现多路等待通知
public class TwoConditionCommunication {public static void main(String[] args) {final Business business = new Business();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 50; i++) {business.sub(i);}}}).start();for (int i = 1; i <= 50; i++) {business.main(i);}}static class Business {Lock lock = new ReentrantLock();Condition condition_sub = lock.newCondition();Condition condition_main = lock.newCondition();private boolean shouldSub = true;public void sub(int i) {lock.lock();try {while (!shouldSub) {try {condition_sub.await();} catch (Exception e) {e.printStackTrace();}}for (int j = 1; j <= 10; j++) {System.out.println("sub2 thread sequence of " + j+ ",loop of " + i);}shouldSub = false;condition_main.signal();} finally {lock.unlock();}}public void main(int i) {lock.lock();try {while (shouldSub) {try {condition_main.await();} catch (Exception e) {e.printStackTrace();}}for (int j = 1; j <= 20; j++) {System.out.println("main thread sequence of " + j+ ",loop of " + i);}shouldSub = true;condition_sub.signal();} finally {lock.unlock();}}}}
?附JDK1.5中Demo
class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); final Object[] items = new Object[100]; int putptr, takeptr, count; public void put(Object x) throws InterruptedException { lock.lock(); try { while (count == items.length) notFull.await(); items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notEmpty.signal(); } finally { lock.unlock(); } } public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) notEmpty.await(); Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; notFull.signal(); return x; } finally { lock.unlock(); } } }