將異步執行的線程轉為同步執行。
調用thread.join()後,當前線程阻塞,直到目標線程run()結束才繼續執行。
public class JoinThread extends Thread {
public static volatile int n = 0;
public void run() {
for (int i = 0; i < 10; i++, n++)
try { sleep(3); } catch (Exception e) {}
}
public static void main(String[] args) throws Exception {
Thread[] threads = new Thread[100];
for (int i = 0; i < 100; i++) threads[i] = new JoinThread();
for (int i = 0; i < 100; i++) threads[i].start();
if (args.length > 0) // 有參數時 join
for (int i = 0; i < 100; i++) threads[i].join();
System.out.println("n=" + JoinThread.n);
}
}
| 命令 | 參數 | 輸出 | 說明 |
|---|---|---|---|
java JoinThread | 無 | n=442 (隨機) | 主線程未等待,100線程未跑完就輸出 |
java JoinThread join | 任意參數 | n=1000 (固定) | join() 生效,100線程全跑完 (100×10) |
volatile 保證 n 讀寫可見性 (非原子性,但此處演示 join 效果)sleep(3) 增加調度隨機性,放大未 join 時的數據不全args.length > 0 靈活控制是否同步join() 拋出 InterruptedException,需 try-catch 或 throwsjoin(millis)、join(millis, nanos) 防止無限等待