admin管理员组文章数量:1599438
Condition是在java1.5才出现。它用来替换传统的 wait(), notify()实现线程之间的协作。但是更加强大。
Condition用 await(), signal, signalAll方法替代wait(), notify()。假如用wait,notify,有三个线程调用一个对象的某个方法,notify只能随机的唤醒一个线程,而不能指定唤醒某个线程,但是用condition的话,就可以唤醒指定的线程。可以看下面的例子。
condition的await,signal和 wait,notify都需要在锁之间运行。
contidion也被用来实现阻塞队列。
condition是通过锁创建出来的。基本代码是 ReentrantLock.newCondition().
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();
}
}
}
}
下面是输出结果。
下面来看看用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 使用 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728321305a1153856.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论