Java线程教程 – Java线程加入
线程可以等待另一个线程死亡或终止。
例子
假设有两个线程,t1和t2。如果线程t1调用t2.join(),线程t1开始等待,直到线程t2终止。
调用t2.join()阻塞直到t2终止。
如果其中一个线程无法继续,直到另一个线程完成执行,在程序中使用join()方法是很有用的。
下面的代码有一个例子,当程序完成执行时,它在标准输出上打印一条消息。
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(); } } } }
上面的代码生成以下结果。
从结果我们可以看到“完成”。被打印在来自真实线程的消息之前。 t1.start();
刚刚启动该线程,它会阻断执行,并等待线程完成。
下面的代码使用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(); } } } }
上面的代码生成以下结果。
注意
Thread类的join()方法是重载的。
其他两个版本接受超时参数。
如果我们使用join()方法和超时,调用者线程将等待,直到它被调用的线程被终止或超时已经过去。
我们应该在线程启动后调用join()方法。
如果我们在未启动的线程上调用join()方法,它立即返回。
如果我们在终止的线程上调用join()方法,它立即返回。