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

Java 線程調度:join() 合併線程詳解

     編輯:Java 相關知識

join() 方法核心功能

join() 是非靜態方法,用於讓當前線程等待目標線程終止。三種重載形式:

  • void join():無限期等待
  • void join(long millis):最多等待指定毫秒數
  • void join(long millis, int nanos):最多等待毫秒+納秒

本質上,join() 內部調用 wait(),釋放鎖並進入等待狀態,直到目標線程結束或超時。

代碼示例:主線程與子線程合併

/** 
 * Java線程:線程的調度-合並
 * @author leizhimin 2009-11-4 9:02:40 
 */
public class Test {
    public static void main(String[] args) {
        Thread t1 = new MyThread1();
        t1.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("主線程第" + i + "次執行!");
            if (i > 2) try {
                // t1線程合並到主線程中,主線程停止執行過程,轉而執行t1線程,直到t1執行完畢後繼續。
                t1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class MyThread1 extends Thread {
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("線程1第" + i + "次執行!");
        }
    }
}

運行結果分析

主線程第0次執行!
主線程第1次執行!
主線程第2次執行!
線程1第0次執行!
主線程第3次執行!
線程1第1次執行!
線程1第2次執行!
線程1第3次執行!
線程1第4次執行!
線程1第5次執行!
線程1第6次執行!
線程1第7次執行!
線程1第8次執行!
線程1第9次執行!
主線程第4次執行!
主線程第5次執行!
主線程第6次執行!
主線程第7次執行!
主線程第8次執行!
主線程第9次執行!
主線程第10次執行!
主線程第11次執行!
主線程第12次執行!
主線程第13次執行!
主線程第14次執行!
主線程第15次執行!
主線程第16次執行!
主線程第17次執行!
主線程第18次執行!
主線程第19次執行!
Process finished with exit code 0

關鍵觀察:

  • 主線程執行到 i=3 時調用 t1.join()
  • 主線程阻塞,線程1 開始執行並連續完成 0-9
  • 線程1 結束後,主線程恢復執行 i=4 至 19
  • 雖然循環中每次都調用 join(),但線程1 已終止,後續 join() 立即返回

常見應用場景

  • 主線程等待初始化線程完成(如配置加載、資源預熱)
  • 分階段任務:階段A線程必須完成才能啟動階段B
  • 測試代碼中等待後台線程結束再驗證結果

注意事項

  • 調用 join() 的線程必須處理 InterruptedException
  • 避免死鎖:若線程A join 線程B,線程B 又 join 線程A
  • 超時版本可防止無限等待,增強健壯性

出處:https://lavasoft.blog.51cto.com/62575/221817

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved