java中的Thread类的join

join是Thread的实例方法,官方解释为:等待该线程终止。
其作用就是将调用join的线程优先执行,当前正在执行的线程阻塞,直到调用join方法的线程执行完毕或者被打断,主要用于线程之间的交互。
还有两个重载的方法:
1、 join(long millis),等待该线程终止的时间最长为 millis 毫秒。为 0 意味着要一直等下去。
2、 join(long millis, int nanos),等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
下面以几个例子说明:
例1:
System.out.println("主线程开始.");
TaskD taskD = new TaskD();
taskD.start();
try {
	hread.sleep(2000);
	System.out.println("taskD join,主线程等待.");
	/*
	* 此处如果taskD没有join,那么主线程会优先执行完毕,taskD在未执行完毕时中断。
	* join之后,主线程等待线程taskD执行完毕再执行
	*/
	taskD.join();
} catch (InterruptedException e) {
	e.printStackTrace();
}
System.out.println("主线程结束.");
 

 
例2:
System.out.println("主线程开始.");
TaskD taskD = new TaskD();
TaskE taskE = new TaskE(taskD);
try {
	taskD.start();
	Thread.sleep(2000);
	taskE.start();
	/*
	* 此处taskE join,主线程等待,
	 * 在taskE执行时,taskD join,所以 最有的执行优先级时taskD,taskE,主线程
	*/
	taskE.join();
} catch (InterruptedException e) {
	e.printStackTrace();
}
System.out.println("主线程结束.");
例3:
System.out.println("主线程开始.");
		TaskD taskD = new TaskD();
		TaskE taskE = new TaskE(taskD);
		try {
			taskD.start();
			Thread.sleep(2000);
			taskE.start();
			/*
			 * 此处taskE不进行 join,主线程不等待,
			 * 在taskE执行时,taskD join, taskE等待taskD执行完毕再执行
			 * 但由于主线程没有阻塞,优先taskD和taskE执行完毕,所以taskD和taskE被中断。
			 */
			//System.out.println("taskE join,主线程等待.");
			//taskE.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("主线程结束.");
 

猜你喜欢

转载自men4661273.iteye.com/blog/2360368
今日推荐