Java實現(xiàn)三個線程進行順序打印的兩種方案
引言
“三個線程按順序打印”是一個經(jīng)典的并發(fā)編程面試題,通常要求線程 A 打印 1,線程 B 打印 2,線程 C 打印 3,然后循環(huán)往復(fù)。
實現(xiàn)這個邏輯的核心在于線程間的通信(Signaling)。我們可以使用 Java 的 synchronized 配合 wait/notify,或者更現(xiàn)代的 ReentrantLock 配合 Condition。
方案一:使用ReentrantLock和Condition(推薦)
這是最清晰的方案。我們?yōu)槊總€線程創(chuàng)建一個“信號燈”(Condition),手動控制喚醒哪一個。
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class SequencePrint {
private final Lock lock = new ReentrantLock();
private final Condition cond1 = lock.newCondition();
private final Condition cond2 = lock.newCondition();
private final Condition cond3 = lock.newCondition();
private int state = 1; // 當前應(yīng)該打印的序號
public void print(String name, int targetState, Condition current, Condition next) {
for (int i = 0; i < 10; i++) { // 假設(shè)打印10輪
lock.lock();
try {
// 如果還沒輪到我,就一直等著
while (state != targetState) {
current.await();
}
System.out.print(name + " ");
// 修改狀態(tài)并喚醒下一個線程
state = (targetState % 3) + 1;
next.signal();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
lock.unlock();
}
}
}
public static void main(String[] args) {
SequencePrint sp = new SequencePrint();
new Thread(() -> sp.print("A", 1, sp.cond1, sp.cond2)).start();
new Thread(() -> sp.print("B", 2, sp.cond2, sp.cond3)).start();
new Thread(() -> sp.print("C", 3, sp.cond3, sp.cond1)).start();
}
}
方案二:使用synchronized和wait/notifyAll(最基礎(chǔ))
這種方式代碼最少,但效率略低,因為 notifyAll() 會喚醒所有等待線程,不滿足條件的線程會被喚醒后再次檢查并掛起。
public class WaitNotifyPrint {
private int state = 1;
private final Object lock = new Object();
public void print(String name, int targetState) {
for (int i = 0; i < 10; i++) {
synchronized (lock) {
while (state != targetState) {
try { lock.wait(); } catch (InterruptedException e) {}
}
System.out.print(name);
state = (state % 3) + 1;
lock.notifyAll(); // 喚醒所有人,讓他們競爭判斷 state
}
}
}
public static void main(String[] args) {
WaitNotifyPrint wnp = new WaitNotifyPrint();
new Thread(() -> wnp.print("A", 1)).start();
new Thread(() -> wnp.print("B", 2)).start();
new Thread(() -> wnp.print("C", 3)).start();
}
}
到此這篇關(guān)于Java實現(xiàn)三個線程進行順序打印的兩種方案的文章就介紹到這了,更多相關(guān)Java三個線程順序打印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java KindEditor粘貼圖片自動上傳到服務(wù)器功能實現(xiàn)
這篇文章主要介紹了Java KindEditor粘貼圖片自動上傳到服務(wù)器功能實現(xiàn),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04
Spring Security實現(xiàn)身份認證和授權(quán)的示例代碼
在 Spring Boot 應(yīng)用中使用 Spring Security 可以非常方便地實現(xiàn)用戶身份認證和授權(quán),本文主要介紹了Spring Security實現(xiàn)身份認證和授權(quán)的示例代碼,感興趣的可以了解一下2023-06-06
Spring組件初始化擴展點BeanPostProcessor的作用詳解
本文通過實戰(zhàn)案例和常見應(yīng)用場景詳細介紹了BeanPostProcessor的使用,并強調(diào)了其在Spring擴展中的重要性,感興趣的朋友一起看看吧2025-03-03

