一个线程上调用另外一个线程,其效果是等待一段时间直到第二个线程结束才继续执行.也能够在join()加一个超时的参数,这样在这段时间到期尚未结束的话,join总能返回。
若是在一个线程中调用t.join(),那么此线程将被挂起直到t运行结束才恢复:java
public class Sleeper extends Thread { private int duration; public Sleeper(String threadName, int duration) { super(threadName); this.duration = duration; start(); } @Override public void run() { try { sleep(duration); } catch (InterruptedException e) { // TODO Auto-generated catch block // e.printStackTrace(); System.out.println("sleeper:"+getName()+" is interrupted"); return; } System.out.println("sleeper:"+getName()+" has awakened"); } }
public class Jioner extends Thread { private Sleeper sleeper; public Jioner(Sleeper sleeper, String threadName) { super(threadName); this.sleeper = sleeper; start(); } @Override public void run() { // TODO Auto-generated method stub try { sleeper.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block // e.printStackTrace(); System.out.println("joiner:" + getName() + " is interrupted"); } System.out.println("joiner:" + getName() + " completed"); } public static void main(String[] args) { Sleeper s1 = new Sleeper("s1", 15000), s2 = new Sleeper("s2", 15000); Jioner j1 = new Jioner(s1, "j1"), j2 = new Jioner(s2, "j2"); s1.interrupt(); } }
输出:
sleeper:s1 is interrupted
joiner:j1 completed
sleeper:s2 has awakened
joiner:j2 completed
能够看出joiner没有本身直接运行结束而是等待sleeper线程运行完成以后才继续运行至结束。面试
题外话:这个join的具体用处能够在 A、B、C三个线程必须按照abc这样的顺序执行的时候运用。(C.join B 、 B.join A) 这也是一个经典的java多线程面试题目:如何让abc三个线程按照顺序执行?答案可能有不少,最简单的是用join来实现。我在阿里一面的时候被问到了,我当时答得是什么破玩意。 如今才知道答案还不算太晚。多线程
这个不推荐使用:
think in java 中:
ide