首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多線程 join() 方法詳解:異步轉同步、100線程驗證與命令行參數控制

     編輯:Java 相關知識

join() 核心功能

將異步執行的線程轉為同步執行。
調用 thread.join() 後,當前線程阻塞,直到目標線程 run() 結束才繼續執行。

驗證代碼:100線程累加

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 靈活控制是否同步

實戰應用場景

  • 主線程聚合多線程計算結果 (MapReduce 模式)
  • 測試代碼等待被測線程完成
  • 啟動階段初始化多組件並行,主線程彙總

注意事項

  • join() 拋出 InterruptedException,需 try-catch 或 throws
  • 避免死鎖:A join B,B join A → 互相等待
  • 超時版本:join(millis)、join(millis, nanos) 防止無限等待
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved