如果有一个A执行绪正在运行,您希望插入一个B执行绪,并要求B执行绪先执行完毕,然后再继续A执行绪的流程,您可以使用 join()方法来完成这个需求,这就好比您手头上正有一个工作在进行,老板插入一个工作要求您先作好,然后再进行您原先正进行的工作。
当执行绪使用join()加入至另一个执行绪时,另一个执行绪会等待这个被加入的执行绪工作完毕,然后再继续它的动作,使用下面这个简单的例子就可以 说明:
package onlyfun.caterpillar; public class ThreadA { public static void main(String[] args) { System.out.println("Thread A 执行"); Thread threadB = new Thread(new Runnable() { public void run() { try { System.out.println("Thread B 开始.."); for(int i = 0; i < 5; i++) { Thread.sleep(1000); System.out.println("Thread B 执行.."); } System.out.println("Thread B 即将结束.."); } catch(InterruptedException e) { e.printStackTrace(); } } }); threadB.start(); try { // Thread B 加入 Thread A threadB.join(); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println("Thread A 执行"); } }
程序启动后主执行绪就开始,在主执行绪中您新建threadB,并在启动threadB后,将之加入(join)主执行绪的流程之中,threadB必须 先执行完毕,主执行绪才会再继续它原本的流程, 执行结果如下:
Thread A 执行 Thread B 开始.. Thread B 执行.. Thread B 执行.. Thread B 执行.. Thread B 执行.. Thread B 执行.. Thread B 即将结束.. Thread A 执行
如果程序中没有将threadB使用join()将之加入主执行绪的流程中,则最后一行显示"Thread A 执行"的陈述会先执行完毕(因为threadB使用了sleep(),这让主执行绪有机会取得时间来执行)。
有时候这个加入的执行绪有可能处理太久,您不想无止境的等待这个执行绪的工作完毕,则您可以在join()上指定时间,例如 join(10000),表示至多等待10000毫秒,也就是10秒,如果加入的执行绪还没执行完毕就不管它,目前的执行绪可以继续执行工作。