join
- 一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。如果某个线程在另一个线程t上调用t.join(),此线程将被挂起,直到目标线程t结束才恢复(即t.isAlive()返回为假)
- 也可以在调用join()时带上一个超时参数(单位可以是毫秒,或者毫秒和纳秒),这样如果目标线程在这段时间到期时还没有结束的话,join()方法总能返回。
- 对join()方法的调用可以被中断,做法是在调用线程上调用interrupt()方法,这时需要用到try-catch子句。
/**
* Created by Panda on 2018/6/4.
*/
class Sleeper extends Thread{
private int duration;
public Sleeper(String name,int sleepTime){
super(name);
duration=sleepTime;
start();
}
public void run(){
try{
sleep(duration);
}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{
sleeper.join();
}catch (InterruptedException e){
System.out.println("Interrupted");
}
System.out.println(getName()+" join completed");
}
}
public class Joining {
public static void main(String[] args) {
Sleeper sleeper =new Sleeper("sleeper1",1500);
Sleeper sleeper1=new Sleeper("sleeper2",1500);
Joiner joiner1=new Joiner("joiner1",sleeper);
Joiner joiner2=new Joiner("joiner2",sleeper1);
sleeper1.interrupt();
}
/**
* sleeper2 was interrupted. isInterrupted(); false
joiner2 join completed
sleeper1 has awakened
joiner1 join completed
*/
}