首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

运用Condition实现多路等待通知

2012-12-18 
使用Condition实现多路等待通知一个锁内部可以有多个Condition,即有多路等待和通知,可参考JDK1.5的Lock和C

使用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();     }   }  }

热点排行