1. 程式人生 > >三個執行緒輪流執行順序列印ABC(二):使用Lock+Condition實現

三個執行緒輪流執行順序列印ABC(二):使用Lock+Condition實現

需求:有三個執行緒輪流執行,第一個執行緒列印A,第二個執行緒列印B,第三個執行緒列印C……迴圈10次。

思路:三個執行緒對應三個Condition、三個Condition共享一個Lock、一個執行緒輪流狀態state。執行緒拿到鎖之後,通過state進行判斷,如果沒有輪到當前執行緒列印,則通過當前執行緒對應的Condition使當前執行緒進入等待狀態,並釋放鎖;如果輪到當前執行緒列印,則執行列印、更改state狀態以及通過下一個執行緒對應的Condition喚醒下一個執行緒;……迴圈10次。

效率:執行緒不滿足條件等待,滿足條件執行列印,並喚醒下一個執行緒,效率比較高。

實現程式碼

package edu.self.multithread;

import
java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Created by SunYanhui on 2017/12/7. */ public class MultipleThreadRotationUsingExplicitLockCondition { public static void main(String[] args) { PrintABCUsingCondition printABC = new
PrintABCUsingCondition(); new Thread(() -> printABC.printA()).start(); new Thread(() -> printABC.printB()).start(); new Thread(() -> printABC.printC()).start(); } } class PrintABCUsingCondition { private Lock lock = new ReentrantLock(); private Condition
conditionA = lock.newCondition(); private Condition conditionB = lock.newCondition(); private Condition conditionC = lock.newCondition(); private int state = 0; //private int attempts = 0; public void printA() { print("A", 0, conditionA, conditionB); } public void printB() { print("B", 1, conditionB, conditionC); } public void printC() { print("C", 2, conditionC, conditionA); } private void print(String name, int currentState, Condition currentCondition, Condition nextCondition) { for (int i = 0; i < 10; ) { lock.lock(); try { //System.out.println(Thread.currentThread().getName()+" try to print "+name+", attempts : "+(++attempts)); while (state % 3 != currentState) { currentCondition.await(); } System.out.println(Thread.currentThread().getName() + " print " + name); state++; i++; nextCondition.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } }