ITEEDU

Java Gossip: 执行绪的加入(join)

如果有一个A执行绪正在运行,您希望插入一个B执行绪,并要求B执行绪先执行完毕,然后再继续A执行绪的流程,您可以使用 join()方法来完成这个需求,这就好比您手头上正有一个工作在进行,老板插入一个工作要求您先作好,然后再进行您原先正进行的工作。

当执行绪使用join()加入至另一个执行绪时,另一个执行绪会等待这个被加入的执行绪工作完毕,然后再继续它的动作,使用下面这个简单的例子就可以 说明:

ThreadA.java
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秒,如果加入的执行绪还没执行完毕就不管它,目前的执行绪可以继续执行工作。