Java怎么使用Condition实现精准唤醒线程(condition,java,开发技术)

时间:2024-05-03 05:40:50 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

Condition简要介绍

Condition是一个接口,创建Condition的实例不能直接new,Java为我们提供一个通过Lock类实例来调用newCondition()的方法来创建。Condition因素出Object监视器方法( wait , notify和notifyAll )到不同的对象,以得到具有多个等待集的每个对象,通过将它们与使用任意的组合的效果Lock个实现。 如果Lock替换了synchronized方法和语句的使用,则Condition将替换Object监视方法的使用。
条件(也称为条件队列或条件变量 )为一个线程提供暂停执行(“等待”)的手段,直到另一个线程通知某个状态条件现在可能为真。 由于对此共享状态信息的访问发生在不同的线程中,因此必须对其进行保护,因此某种形式的锁定与该条件相关联。 等待条件提供的关键属性是它以原子方式释放关联的锁并挂起当前线程,就像Object.wait一样。

Condition里的主要方法

Java怎么使用Condition实现精准唤醒线程

使用Condition的Demo

例子1

packagetestJUC;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassTestCondition{publicstaticvoidmain(String[]args){Product3product=newProduct3();newThread(()->{for(inti=0;i<5;i++)newProducer(product).getProduct();},"工厂").start();newThread(()->{for(inti=0;i<5;i++)newConsumer(product).saleProduct();},"学生").start();}}classProduct3{privateLocklock=newReentrantLock();privateConditioncondition1=lock.newCondition();privateConditioncondition2=lock.newCondition();privateintflag=1;//标识符publicvoidgetProduct(){//加锁lock.lock();try{//使用while循环,可以有效避免线程虚假唤醒while(flag!=1){condition1.await();}flag=2;//唤醒saleProductcondition2.signal();System.out.println(Thread.currentThread().getName()+"生产一个产品");}catch(InterruptedExceptione){e.printStackTrace();}finally{//解锁lock.unlock();}}publicvoidsaleProduct(){lock.lock();try{while(flag!=2){condition2.await();}flag=1;//唤醒getProductcondition1.signal();System.out.println(Thread.currentThread().getName()+"消费了一个产品");}catch(InterruptedExceptione){e.printStackTrace();}finally{lock.unlock();}}}//实体类classProducer{privateProduct3product=null;publicProducer(Product3product){this.product=product;}publicvoidgetProduct(){product.getProduct();}}classConsumer{privateProduct3product=null;publicConsumer(Product3product){this.product=product;}publicvoidsaleProduct(){product.saleProduct();}}

结果

Java怎么使用Condition实现精准唤醒线程

例子2

packagetestJUC;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassTestCondition{publicstaticvoidmain(String[]args){Printprint=newPrint();newThread(()->{for(inti=0;i<5;i++)print.printA();}).start();newThread(()->{for(inti=0;i<5;i++)print.printB();}).start();newThread(()->{for(inti=0;i<5;i++)print.printC();}).start();}}classPrint{privateLocklock=newReentrantLock();privateConditioncondition1=lock.newCondition();privateConditioncondition2=lock.newCondition();privateConditioncondition3=lock.newCondition();privateintnumber=1;//输出A的方法publicvoidprintA(){//加锁lock.lock();try{//使用while循环,可以有效避免线程虚假唤醒while(number!=1){condition1.await();}number=2;//唤醒输出B的方法condition2.signal();System.out.println("AAA");}catch(InterruptedExceptione){e.printStackTrace();}finally{//解锁lock.unlock();}}//输出B的方法publicvoidprintB(){//加锁lock.lock();try{while(number!=2){condition2.await();}System.out.println("BBB");number=3;//唤醒Ccondition3.signal();}catch(InterruptedExceptione){e.printStackTrace();}finally{//唤醒输出C的方法lock.unlock();}}//输出C的方法publicvoidprintC(){//加锁lock.lock();try{while(number!=3){condition3.await();}System.out.println("CCC");number=1;//唤醒输出A的方法condition1.signal();}catch(InterruptedExceptione){e.printStackTrace();}finally{//解锁lock.unlock();}}}

结果2

Java怎么使用Condition实现精准唤醒线程

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Java怎么使用Condition实现精准唤醒线程的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Python中的作用域与名字空间实例分析下一篇:

11 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18