三個執行緒輪流執行順序列印ABC(三):使用Lock實現
阿新 • • 發佈:2019-01-10
需求:有三個執行緒輪流執行,第一個執行緒列印A,第二個執行緒列印B,第三個執行緒列印C……迴圈10次。
思路:三個執行緒共享同一把鎖、一個執行緒輪流狀態state。執行緒拿到鎖之後,通過state進行判斷,如果輪到當前執行緒列印,則執行列印、更改state狀態。每個執行緒都不停的迴圈,獲取鎖、判斷state,執行列印,並……直到每個執行緒列印10次。
效率:由於三個執行緒不停的搶佔鎖,但是獲取鎖後不一定具備列印條件,所以效能比較低。
實現程式碼:
package edu.self.multithread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Created by SunYanhui on 2017/12/6.
*/
public class MultipleThreadRotationUsingExplicitLock {
public static void main(String[] args) {
PrintABCUsingReentrantLock printABC = new PrintABCUsingReentrantLock();
new Thread(() -> printABC.printA()) .start();
new Thread(() -> printABC.printB()).start();
new Thread(() -> printABC.printC()).start();
}
}
class PrintABCUsingReentrantLock {
private Lock lock = new ReentrantLock();
private int state = 0;
//private int attempts =0;
public void printA() {
print ("A", 0);
}
public void printB() {
print("B", 1);
}
public void printC() {
print("C", 2);
}
private void print(String name, int currentState) {
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) {
System.out.println(Thread.currentThread().getName() + " print " + name);
state++;
i++;
}
}finally {
lock.unlock();
}
}
}
}