join() 使呼叫執行緒阻塞,直到目標執行緒結束。將異步 start() 變為同步流程,確保後續程式碼在執行緒完成後才執行。
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 ignored) {}
}
}
public static void main(String[] args) throws Exception {
Thread[] threads = new Thread[100];
for (int i = 0; i < threads.length; i++) threads[i] = new JoinThread();
for (Thread t : threads) t.start();
// 無參數執行:不 join
// 有參數執行:加入 join
if (args.length > 0) {
for (Thread t : threads) t.join(); // 等待所有結束
}
System.out.println("n = " + n);
}
}
| 執行方式 | 指令 | 輸出 n | 說明 |
|---|---|---|---|
| 無 join | java mythread.JoinThread | 442 (不定) | 主執行緒未等待,提前印出 |
| 有 join | java mythread.JoinThread join | 1000 | 100 條執行緒全跑完,n 正確 |
證明 join() 能可靠同步多執行緒結果。