一個線程的輸入可能非常依賴于另外一個或者多個線程的輸出打掘,此時這個線程就需要等待依賴線程執(zhí)行完畢届氢,才能繼續(xù)執(zhí)行乖菱。JDK 提供了 join()操作來實(shí)現(xiàn)這個功能助币。
public final void join()
public final synchronized void join(long millis)
第一個 join()方法表示無線等待静陈,他會一直阻塞當(dāng)前線程燕雁,直到目標(biāo)線程執(zhí)行完畢。第二個方法給出了一個最大的等待時間鲸拥,如果超過給定的時間目標(biāo)線程還在執(zhí)行拐格,當(dāng)前線程也會因?yàn)椤暗炔患傲恕保^續(xù)往下執(zhí)行刑赶。
/**
* Created by zhangjianghong on 2017/8/1.
*/
public class JoinMain {
public volatile static int i = 0;
public static class AddThread extends Thread{
@Override
public void run() {
for (i = 0; i < 10000; i++);
}
}
public static void main(String[] args) throws InterruptedException {
AddThread addThread = new AddThread();
addThread.start();
addThread.join();
System.out.println(i);
}
}
如果沒有addThread.join(); 程序運(yùn)行結(jié)果可能是 0 或者一個小于10000 的數(shù)字捏浊,是因?yàn)锳ddThread 線程還沒有跑結(jié)束,主線程就結(jié)束了撞叨,當(dāng)加了join()方法時金踪,表示主線程等待AddThread線程執(zhí)行結(jié)束后再繼續(xù)執(zhí)行,所以它的結(jié)果肯定是10000谒所。