線程可以等待另一個(gè)線程死亡或終止。
假設(shè)有兩個(gè)線程,t1和t2。如果線程t1調(diào)用t2.join(),線程t1開始等待,直到線程t2終止。
調(diào)用t2.join()阻塞直到t2終止。
如果其中一個(gè)線程無(wú)法繼續(xù),直到另一個(gè)線程完成執(zhí)行,在程序中使用join()方法是很有用的。
下面的代碼有一個(gè)例子,當(dāng)程序完成執(zhí)行時(shí),它在標(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é)果我們可以看到“完成”。被打印在來(lái)自真實(shí)線程的消息之前。 t1.start();
剛剛啟動(dòng)該線程,它會(huì)阻斷執(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()方法是重載的。
其他兩個(gè)版本接受超時(shí)參數(shù)。
如果我們使用join()方法和超時(shí),調(diào)用者線程將等待,直到它被調(diào)用的線程被終止或超時(shí)已經(jīng)過(guò)去。
我們應(yīng)該在線程啟動(dòng)后調(diào)用join()方法。
如果我們?cè)谖磫?dòng)的線程上調(diào)用join()方法,它立即返回。
如果我們?cè)诮K止的線程上調(diào)用join()方法,它立即返回。
更多建議: