Java怎么使用Condition实现精准唤醒线程
导读:本文共2537.5字符,通常情况下阅读需要8分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: Condition简要介绍Condition是一个接口,创建Condition的实例不能直接new,Java为我们提供一个通过Lock类实例来调用newCondition()的方法来创建。Condition因素出Object监视器方法( wait , notify和notifyAll )到不同的对象,以得到具有多个等待集的每个对象,通过将它们与使用任意的组合的效... ...
目录
(为您整理了一些要点),点击可以直达。Condition简要介绍
Condition是一个接口,创建Condition的实例不能直接new,Java为我们提供一个通过Lock类实例来调用newCondition()的方法来创建。Condition因素出Object监视器方法( wait , notify和notifyAll )到不同的对象,以得到具有多个等待集的每个对象,通过将它们与使用任意的组合的效果Lock个实现。 如果Lock替换了synchronized方法和语句的使用,则Condition将替换Object监视方法的使用。
条件(也称为条件队列或条件变量 )为一个线程提供暂停执行(“等待”)的手段,直到另一个线程通知某个状态条件现在可能为真。 由于对此共享状态信息的访问发生在不同的线程中,因此必须对其进行保护,因此某种形式的锁定与该条件相关联。 等待条件提供的关键属性是它以原子方式释放关联的锁并挂起当前线程,就像Object.wait一样。
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();}}
结果
例子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
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
Java怎么使用Condition实现精准唤醒线程的详细内容,希望对您有所帮助,信息来源于网络。