如果有一个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秒,如果加入的线程还没执行完毕就不管它,目前的线程可以继续执行工作。
|