1.本小节总结join()方法:
1) 一个线程可以在其线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。
2)若果某个线程在另一个线程t上调用join(),此线程将被挂起,直到目标线程t结束才恢复,即t.isAlive()返回为false。
3)也可以调用join()时带上一个超时参数(以毫秒或者毫秒和纳秒为单位),如果目标线程在这段时间到期还没有结束的话,join()方法总能返回。
4)join()方法的调用可以被中断,做法是在调用线程上调用interrupt()方法,这是需要用到try-catch子句。
2.例子:
package
jiangning.c21;
class
Sleeper
extends
Thread{
private
int
duration
;
public
Sleeper(String name,
int
sleepTime){
super
(name);
duration
= sleepTime;
start();
}
public
void
run(){
try
{
System.
out
.println(
"come in sleeper run "
+ System.currentTimeMillis());
sleep(
duration
);
System.
out
.println(
"sleeper end "
+
this
.getName());
}
catch
(InterruptedException e) {
System.
out
.println(getName() +
" was interrupted. "
+
"isInterrupted(): "
+ isInterrupted());
return
;
}
System.
out
.println(getName() +
" has awakened"
);
}
}
class
Joiner
extends
Thread{
private
Sleeper
sleeper
;
public
Joiner(String name, Sleeper sleeper){
super
(name);
this
.
sleeper
= sleeper;
start();
}
public
void
run(){
try
{
System.
out
.println(
"come in Joiner run "
+ System.currentTimeMillis());
sleeper
.join(1000);
//等待sleeper运行完成后再运行。
System.
out
.println(
"joiner end "
+
this
.getName());
}
catch
(InterruptedException e) {
System.
out
.println(
"interrupted"
);
}
System.
out
.println(getName() +
" join completed"
);
}
}
public
class
Joining {
public
static
void
main(String[] args) {
Sleeper
sleepy =
new
Sleeper(
"Sleepy"
,5000),
//创建对象,启动线程,执行休眠方法,
grumpy =
new
Sleeper(
"Grumpy"
,5000);
Joiner
dopey =
new
Joiner(
"Dopey"
,sleepy),
doc =
new
Joiner(
"Doc"
,grumpy);
grumpy.interrupt();
//中断,进入catch
}
}
/**
come in sleeper run 1352701238531
come in sleeper run 1352701238531
come in Joiner run 1352701238531
Grumpy was interrupted. isInterrupted(): false
come in Joiner run 1352701238531
joiner end Doc 1352701238531
Doc join completed
joiner end Dopey 1352701239531
Dopey join completed
sleeper end Sleepy
Sleepy has awakened
*/