天天看点

Java中condition的用法_java condition 使用

Condition是在java1.5才出现。它用来替换传统的 wait(), notify()实现线程之间的协作。但是更加强大。

Condition用 await(), signal, signalAll方法替代wait(), notify()。假如用wait,notify,有三个线程调用一个对象的某个方法,notify只能随机的唤醒一个线程,而不能指定唤醒某个线程,但是用condition的话,就可以唤醒指定的线程。可以看下面的例子。

condition的await,signal和 wait,notify都需要在锁之间运行。

contidion也被用来实现阻塞队列。

condition是通过锁创建出来的。基本代码是 ReentrantLock.newCondition().

Java中condition的用法_java condition 使用
Java中condition的用法_java condition 使用

lock.lock();

condition.await();

lock.unlock();

View Code

下面实现一个 一直abc abc这么有顺序的执行。

下面用synchronized , wait ,notify来实现。

总共有四个类。DemoNoCondition, A,B,C. 其中DemoNoCondition内部有三个方法,a,b,c,都加上了锁,用来打印abc的。A B C三个类,用来表示多个线程调用DemoNoCondition的几个方法来打印abc

packagecom.citi.test.mutiplethread.demo5;public classDemoNoCondition {private intsignal;public synchronized voida(){while(signal!=0){try{

wait();

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("a"+signal);

signal++;

notifyAll();

}public synchronized voidb(){while(signal!=1){try{

wait();

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("b"+signal);

signal++;

notifyAll();

}public synchronized voidc(){while(signal!=2){try{

wait();

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("c"+signal);

signal=0;

notifyAll();

}public static voidmain(String[] args) {

DemoNoCondition d=newDemoNoCondition();

A a=newA(d);

B b=newB(d);

C c=newC(d);newThread(a).start();newThread(a).start();newThread(a).start();newThread(a).start();newThread(c).start();newThread(c).start();newThread(c).start();newThread(c).start();newThread(b).start();newThread(b).start();newThread(b).start();newThread(b).start();newThread(b).start();

}

}

packagecom.citi.test.mutiplethread.demo5;public class A implementsRunnable{privateDemoNoCondition demoCondition;publicA(DemoNoCondition demo) {this.demoCondition=demo;

}

@Overridepublic voidrun() {while(true){

demoCondition.a();try{

Thread.sleep(1000);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

packagecom.citi.test.mutiplethread.demo5;public class B implementsRunnable {privateDemoNoCondition demoCondition;publicB(DemoNoCondition demoCondition) {this.demoCondition=demoCondition;

}

@Overridepublic voidrun() {while(true){

demoCondition.b();try{

Thread.sleep(1000);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

packagecom.citi.test.mutiplethread.demo5;public class C implementsRunnable {privateDemoNoCondition demoCondition;publicC(DemoNoCondition demoCondition) {this.demoCondition=demoCondition;

}

@Overridepublic voidrun() {while(true){

demoCondition.c();try{

Thread.sleep(1000);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

下面是输出结果。

Java中condition的用法_java condition 使用

下面来看看用condition来实现这个功能。代码其实是类似的,只不过,用condition,可以指定唤醒某个线程。可以对比一下两个实现的代码,一个是用notifyAll,一个是直接指定

c.signal,来通知线程c唤醒。这个就是condition的强大之处。

packagecom.citi.test.mutiplethread.demo5;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;public classDemoCondition {private intsignal;private Lock lock=newReentrantLock();private Condition a=lock.newCondition();private Condition b=lock.newCondition();private Condition c=lock.newCondition();public voida(){

lock.lock();while(signal!=0){try{

a.await();

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("a"+signal);

signal++;

b.signal();

lock.unlock();

}public voidb(){

lock.lock();while(signal!=1){try{

b.await();

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("b"+signal);

signal++;

c.signal();

lock.unlock();

}public voidc(){

lock.lock();while(signal!=2){try{

c.await();

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("c"+signal);

signal=0;

a.signal();

lock.unlock();

}public static voidmain(String[] args) {

DemoCondition condition=newDemoCondition();

ACondition a=newACondition(condition);

BCondition b=newBCondition(condition);

CCondition c=newCCondition(condition);newThread(b).start();newThread(a).start();newThread(a).start();newThread(b).start();newThread(c).start();newThread(a).start();newThread(c).start();newThread(a).start();newThread(c).start();newThread(c).start();

}

}

packagecom.citi.test.mutiplethread.demo5;public class ACondition implementsRunnable {privateDemoCondition condition;publicACondition(DemoCondition condition) {this.condition=condition;

}

@Overridepublic voidrun() {while(true){

condition.a();try{

Thread.sleep(1000);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

packagecom.citi.test.mutiplethread.demo5;public class BCondition implementsRunnable {privateDemoCondition condition;publicBCondition(DemoCondition condition) {this.condition =condition;

}public voidrun() {while(true){

condition.b();try{

Thread.sleep(1000);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

};

}

packagecom.citi.test.mutiplethread.demo5;public class CCondition implementsRunnable {privateDemoCondition condition;publicCCondition(DemoCondition condition) {this.condition =condition;

}

@Overridepublic voidrun() {while(true){

condition.c();try{

Thread.sleep(1000);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

Java中condition的用法_java condition 使用