筆試題:編寫一個程式,開啟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();