一個線程上調用另外一個線程,其效果是等待一段時間直到第二個線程結束才繼續執行.也能夠在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