天天看點

多線程面試題:按ABC的順序顯示

筆試題:編寫一個程式,開啟3個線程,這3個線程的ID分别為A、B、C,每個線程将自己的ID在螢幕上列印10遍,要求輸出結果必須按ABC的順序顯示;如:ABCABC….依次遞推。

這是最近筆試遇到一個多線程題,當時沒有做出來,後來經過查找後,找到兩種寫法。

方法一:利用Lock和Condition來實作,代碼如下

public class PrintABC {

private String printFlag = "A";

private Lock lock = new ReentrantLock();

private Condition c1 = lock.newCondition();

private Condition c2 = lock.newCondition();

private Condition c3 = lock.newCondition();

public void printA(){

lock.lock(); 

try {

if(!printFlag.equals("A")){//1.判斷是否到了狀态  是-繼續往下走  否-讓目前線程處于等待狀态

c1.await();//造成目前線程在接到信号或被中斷之前一直處于等待狀态。

}

System.out.println(Thread.currentThread().getName());//2.輸出

printFlag = "B"; //3.将後續狀态改為輸出B

c2.signal();//4.喚醒輸出B的線程

} catch (InterruptedException e) {

e.printStackTrace();

}finally{

lock.unlock();

public void printB(){

lock.lock();

if(!printFlag.equals("B")){

c2.await();

System.out.println(Thread.currentThread().getName());

printFlag = "C";

c3.signal();

public void printC(){

if(!printFlag.equals("C")){

c3.await();

printFlag = "A";

c1.signal();

//測試類

public static void main(String[] args) {

final PrintABC test = new PrintABC();

new Thread(new Runnable() { //建立名稱為A的線程并啟動

public void run() {

for(int x = 0;x<10;x++){//調用十次輸出方法

test.printA();

}},"A").start();

new Thread(new Runnable() { //建立名稱為B的線程并啟動

for(int x = 0;x<10;x++){

test.printB();

}},"B").start();

new Thread(new Runnable() { //建立名稱為C的線程并啟動

test.printC();

}},"C").start(); 

繼續閱讀