本範例展示兩條執行緒透過共享 flag 變數協作,交替執行繪製實心三角形:執行緒 1 輸出前導空格,執行緒 2 輸出星號與換行。雖屬教學示範(生產環境應用 wait/notify 或 BlockingQueue),但清晰展示了「輪流執行」的基本邏輯。
public class mainThread {
public static int flag = 0; // 共享旗標:1=執行緒1工作, 2=執行緒2工作
int count = 10; // 三角形高度
public static void main(String[] arg) {
new mainThread();
}
mainThread() {
thread1 t1 = new thread1(this.count);
thread2 t2 = new thread2(this.count);
t1.start();
t2.start();
flag = 1; // 讓執行緒 1 先工作
}
// 執行緒 1:輸出每行前導空格
class thread1 extends Thread {
int count1;
thread1(int i) { count1 = i; }
public void run() {
while (true) {
if (count1 <= 0) break;
if (mainThread.flag == 1) { // 輪到我
for (int i = 0; i < count1; i++)
System.out.print(" ");
count1--;
mainThread.flag = 2; // 交棒給執行緒 2
}
}
}
}
// 執行緒 2:輸出星號並換行
class thread2 extends Thread {
int count2;
thread2(int i) { count2 = i; }
public void run() {
int count = 0;
while (true) {
if (count >= count2) break;
if (mainThread.flag == 2) { // 輪到我
for (int i = 0; i < (count * 2 + 1); i++)
System.out.print("*");
System.out.print("\n");
count++;
mainThread.flag = 1; // 交棒給執行緒 1
}
}
}
}
}
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
| 步驟 | 執行緒 1 (空格) | 執行緒 2 (星號) | flag 狀態 |
|---|---|---|---|
| 1 | 輸出 9 空格,count1→9 | 等待 | 1→2 |
| 2 | 等待 | 輸出 1 星號,換行,count→1 | 2→1 |
| 3 | 輸出 8 空格,count1→8 | 等待 | 1→2 |
| 4 | 等待 | 輸出 3 星號,換行,count→2 | 2→1 |
| ... | 交替進行 | 交替進行 | 1↔2 |
while(true) if(flag==...) 空轉消耗 CPU,無休眠flag 未宣告 volatile,多核心下可能看不到最新值// 概念示意
synchronized(lock) {
while (!myTurn) lock.wait(); // 釋放鎖進入等待集
// 執行工作
myTurn = false;
lock.notifyAll(); // 喚醒其他執行緒
}
BlockingQueuequeue = new LinkedBlockingQueue<>(); // 生產者 queue.put("data"); // 消費者 String data = queue.take(); // 自動阻塞等待,無忙碌等待、天然同步
此範例雖簡陋,但直觀展示了多執行緒協作的三要素:
理解這層邏輯,進而掌握 wait/notify、Lock/Condition、BlockingQueue、CompletableFuture 等高階協作機制才有根基。