ReentrantLock的Condition条件实现精确唤醒某个线程
生活随笔
收集整理的這篇文章主要介紹了
ReentrantLock的Condition条件实现精确唤醒某个线程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*** 描述: 介紹Reentrantlock的condition條件可以實現精確喚醒某個線程* 題目:多線程之間按順序調用,實現A->B->C三個線程啟動,要求AA打印5次BB打印10次CC打印15次,這樣循環10輪** @author xinjiao.yu@marketin.cn* @create 2020/2/22 20:25* @since 2.16.3*/
class ShareResource{private int number = 1;private Lock lock = new ReentrantLock();private Condition c1 = lock.newCondition();private Condition c2 = lock.newCondition();private Condition c3 = lock.newCondition();public void prints5(){lock.lock();try{// 1.判斷while(number != 1){c1.await();}//2 干活for(int i=1;i<=5;i++){System.out.println(Thread.currentThread().getName()+"\t "+i);}//3修改標志位,通知下一個線程number = 2;c2.signal();}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}public void prints10(){lock.lock();try{// 1.判斷while(number != 2){c2.await();}//2 干活for(int i=1;i<=10;i++){System.out.println(Thread.currentThread().getName()+"\t "+i);}//3修改標志位,通知下一個線程number = 3;c3.signal();}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}public void prints15(){lock.lock();try{// 1.判斷while(number != 3){c3.await();}//2 干活for(int i=1;i<=15;i++){System.out.println(Thread.currentThread().getName()+"\t "+i);}//3修改標志位,通知下一個線程number = 1;c1.signal();}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}
}
public class SyncAndReentrantLockDemo {public static void main(String[] args) {ShareResource shareResource = new ShareResource();new Thread(()->{for(int i=1;i<=10;i++){shareResource.prints5();}},"AA").start();new Thread(()->{for(int i=1;i<=10;i++){shareResource.prints10();}},"BB").start();new Thread(()->{for(int i=1;i<=10;i++){shareResource.prints15();}},"CC").start();}
}
?
總結
以上是生活随笔為你收集整理的ReentrantLock的Condition条件实现精确唤醒某个线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互斥事件的概念和公式_专题49 互斥事件
- 下一篇: ABAP动态模式(Dynamic Pat