public class Sleeper extends Thread {private int duration;public Sleeper(String threadName, int duration) {super(threadName);this.duration = duration;start();}@Overridepublic 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();}@Overridepublic void run() {// TODO Auto-generated method stubtry {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來實現。我在阿里一面的時候被問到了,我當時答得是什么破玩意。 現在才知道答案還不算太晚。