一个线程可以在其他线程之上,调用join()方法,其效果是等待一段时间直到第二个线程结束才执行。如果某个线程在另外一个线程t上调用t.join(),此线程将被挂起,直到目标线程t结束才恢复(即t.isAlive()返回为假)。
也可以在调用join()时带上一个超时参数(单位可以是毫秒,或者毫秒和纳秒)这样如果目标线程在这段时间到期时还没有结束的话,join()方法总能返回。
对join()方法的调用可以被中断,做法是在调用 线程上调用interrupt()方法,这是需要用到try catch子句。
public 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.print(getName()+"was interrupted."+"isInterrupted():"+isInterrupted()); } System.out.print(getName()+"has awakened"); } }
public class Joiner1 extends Thread{ private Sleeper sleeper; public Joiner1(String name,Sleeper sleeper){ super(name); this.sleeper=sleeper; start(); } public void run(){ try { sleeper.join(); }catch (InterruptedException e){ } } }
public class Joining { public static void main(String[] args){ Sleeper sleepy=new Sleeper("Sleepy",1500); Sleeper grumpy=new Sleeper("Grumpy",1500); Joiner1 dopey=new Joiner1("Dopey",sleepy); Joiner1 doc=new Joiner1("Doc",grumpy); grumpy.interrupt(); } }