多執行緒--Thread.join方法
阿新 • • 發佈:2019-01-08
在Thread類的Api中,Join的作用是讓當前執行緒等待目標執行緒結束之後才繼續執行。
分別是
public final synchronized void join(long millis, int nanos); //使當前執行緒等待目標執行緒millis 毫秒 ,nanos納秒之後,當前執行緒繼續執行。
public final synchronized void join(long millis); //使當前執行緒等待目標執行緒millis 毫秒,當前執行緒繼續執行。
public final void join(); //使當前執行緒時刻檢測目標執行緒,直到目標執行緒執行完成,再執行當前執行緒。
下面我們主要檢視下 public final synchronized void join(long millis) 的原始碼:
public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); }if (millis == 0) {
//如果等待的毫秒數為0,則通過Api, isAlive()時刻檢測目標執行緒是否存活,若存活則繼續等待。 while (isAlive()) { wait(0); } } else { while (isAlive()) {
//判斷目標執行緒是否存活,若存活,則等待mills毫秒,然後跳出join,當前執行緒執行。 long delay = millis - now;if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }
從原始碼可以看出,就是當前執行緒在判斷目標執行緒是否存活,如果存活根據引數的值,是無限等待到目標執行緒結束才執行當前執行緒,還是執行一段時間就開始執行當前執行緒。
public final void join();底層呼叫Join(0);實現無限等待知道目標執行緒結束。