線程可以等待另一個線程死亡或終止。
假設(shè)有兩個線程,t1和t2。如果線程t1調(diào)用t2.join(),線程t1開始等待,直到線程t2終止。
調(diào)用t2.join()阻塞直到t2終止。
如果其中一個線程無法繼續(xù),直到另一個線程完成執(zhí)行,在程序中使用join()方法是很有用的。
下面的代碼有一個例子,當(dāng)程序完成執(zhí)行時,它在標(biāo)準(zhǔn)輸出上打印一條消息。
public class Main { public static void main(String[] args) { Thread t1 = new Thread(Main::print); t1.start(); System.out.println("Done."); } public static void print() { for (int i = 1; i <= 5; i++) { try { System.out.println("Counter: " + i); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
上面的代碼生成以下結(jié)果。
從結(jié)果我們可以看到“完成”。被打印在來自真實線程的消息之前。 t1.start();
剛剛啟動該線程,它會阻斷執(zhí)行,并等待線程完成。
下面的代碼使用join()等待線程完成,然后打印“完成”。
public class Main { public static void main(String[] args) { Thread t1 = new Thread(Main::print); t1.start(); try { t1.join(); // "main" thread waits until t1 is terminated } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Done."); } public static void print() { for (int i = 1; i <= 5; i++) { try { System.out.println("Counter: " + i); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
上面的代碼生成以下結(jié)果。
Thread類的join()方法是重載的。
其他兩個版本接受超時參數(shù)。
如果我們使用join()方法和超時,調(diào)用者線程將等待,直到它被調(diào)用的線程被終止或超時已經(jīng)過去。
我們應(yīng)該在線程啟動后調(diào)用join()方法。
如果我們在未啟動的線程上調(diào)用join()方法,它立即返回。
如果我們在終止的線程上調(diào)用join()方法,它立即返回。
更多建議: