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

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

需求:有三個執行緒輪流執行,第一個執行緒列印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(); } } } }