三個執行緒輪流執行順序列印ABC(二):使用Lock+Condition實現
阿新 • • 發佈:2018-12-30
需求:有三個執行緒輪流執行,第一個執行緒列印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();
}
}
}
}