condition和Lock锁一样出现在jdk1.5中的,它的出现使用来替代传统的Object的wait()/notify()方法,配合Lock锁实现线程间的协作的。
java.util.concurrent.locks包下常用的类与接口(jdk1.5中):
Lock 和 Thread 三者之间的关系如下图:
Condition中主要的方法包括:await()/signal(),它们分别对应Object中的wait()/notify()方法,Condition相比较Object方法提供了更安全、高效和灵活的线程间协作,condition依赖与Lock接口,condition通过Lock.newCondition创建,同时,Condition必须在Lock的保护内使用。在多线程的状态下,可以通过以condition实例为单位的通知等待机制的分组,只通知部分线程。
condition分组实例:
// 线程 A class ThreadA extends Thread { private MyService service; public ThreadA(MyService service) { super(); this.service = service; } @Override public void run() { service.awaitA(); } } // 线程 B class ThreadB extends Thread { private MyService service; public ThreadB(MyService service) { super(); this.service = service; } @Override public void run() { service.awaitB(); } } class MyService { private Lock lock = new ReentrantLock(); // 使用多个Condition实现通知部分线程 public Condition conditionA = lock.newCondition(); public Condition conditionB = lock.newCondition(); public void awaitA() { lock.lock(); try { System.out.println("begin awaitA时间为" + System.currentTimeMillis() + " ThreadName=" + Thread.currentThread().getName()); conditionA.await(); System.out.println(" end awaitA时间为" + System.currentTimeMillis() + " ThreadName=" + Thread.currentThread().getName()); } cat