wwwjlcjava. org
第16章多线程
>>1 6.4.1join线程
Thread提供了让一个线程等待另一个线程完成的方法-join0方法。当在某个程序执行流中调用
其他线程的join0方法时,调用线程将被阻塞,直到被join0方法加入的join线程执行完为止。
join()方法通常由使用线程的程序调用,以将大问题划分成许多小问题,每个小问题分配一个线程。
当所有的小问题都得到处理后,再调用主线程来进一步操作。
程序清单:code8\16\16.4UoinThread.java
public class JoinThread extends Thread
(
//提供一个有参数的构造嚣,用于设置该线程的名字
public JoinThread(String name)
l
super (name),
}
//莺写run(}方法,定义线程执行体
public void run()
I
for (int i一0; i<100 ; i++)
(
System.out,println <getName() +一 一+i》7
)
l
public static void main<StringIJ args)throws Exception
I
//启动子线程
new JoinThread(”毒钧姨;程”).start()≯
for (int i景0; i<100 ; i++ )
I
if (i t一20)
{
JoinThread jt—new JoinThread("被Join的线器¨),
jt*start C);
//main线程调用了jt线程的join()方法,main线程
//必须等jt执行结束才会向下执行
,t.,ohl'7
l
System*out.println (Thread.currentThread l).getName()
+¨ “+i);
}
}
}
上面程序中一共有3个线程,主方法开始时就启动了名为“新线程”的子线程,该子线程将会和
main线程推发执行。当主线程的循环变量i等于20时t启动了名为“被Join的线程”的线程,该线程
不会和main线程并发执行.main线程必须等该线程执行结束后才可以向下执行。在名为“被Join的线
程一的线程执行时,实际上只有2个子线程并发执行,而
主线程处于等待状态。运行上面程序,.会看到如图1—6.5所
- -
示的运行效果。一
从图16.5中,盱以看出,主线程执行到i:一20时启动,
并join了名为“被Join-的线程”-的线程卜所以主线程将一
直处于阻塞状态,直到名为“被Join昀线程”的线程执行
完成。
join0方法有如-下3种重载形式。
'oin的缝X
'oin誊鲮程
oin的鲮程
oin的线程
oin的娩程
oinl战程
oin的线经
oinht线爱
ln 22
ln 23
92
93
舛
95
96
..___-_--._..______-.1.________--_-一
97 ttjo蛐竣■-执行完废
98_囊才tt露执行
∞‘’‘’’‘‘‘一
—J
》jofn():等徒被join的线程执行完成。 圈16.S主线程等待join线程的效果
> jom(long millis):等德--join的线程的时间最长为millis毫秒。如果在millis毫秒内-被joIn的线
程还没有执行结束k则不再等待。
> join(longmillis,int-nanos-):等待被join的线程的时间最长为millis毫秒加nanos毫微秒。
●7J9
瘕托
JaVai似(第2版)
痰狂软件教育
..-.--..._-_-...___--.-_-.-..-_-L-...___I....___..-.__-.-..---..._-.-.-.___...._-—-’...--_.-._-‘_I
-‘
常我们很少使用第3种形式的方法,原因有两个:程序对时间的精度无须精确到毫 I
计算机硬件。操作系统本身也无法精确到毫微秒.
.._-.一..-—-.-.---...._-.-..._.’-....-__..1._....._--..-.-_-.-.--.I.-.-___....___-..--._一...-._-
>>1 6.4.2 后台线程
. .