標籤:異常 div art wait except 迴圈 new 其他 nal
1,方法的作用:
父線程等待子線程的執行。
如果是join或者join(0),即等待時間長度是0,父線程就會一直等到子線程執行結束,
如果是join(time),即等待時間長度是time數值,那父線程等待時間長度視情況而定:
第一種:子線程執行時間長度不需要time時間長度,那麼父線程就可能不會等待到time時間長度,為什麼是可能呢?是不是要考慮其他線程(不包括父線程,和子線程以外的線程),他也可能讓父線程等待的(沒有擷取到cpu時間片等原因),
第二種:子線程執行時間長度超過time時間長度,那麼父線程的等待時間長度,至少是time時間長度,
2,源碼分析:
1 public final synchronized void join(long millis) 2 throws InterruptedException { 3 long base = System.currentTimeMillis(); 4 long now = 0; 5 6 if (millis < 0) { 7 throw new IllegalArgumentException("timeout value is negative"); 8 } 9 10 if (millis == 0) {11 while (isAlive()) {12 wait(0);13 }14 } else {15 while (isAlive()) {16 long delay = millis - now;17 if (delay <= 0) {18 break;19 }20 wait(delay);21 now = System.currentTimeMillis() - base;22 }23 }24 }
1.首先確定的是join方法的形參必須是大於零的數值,否則該方法拋出異常IllegalArgumentException("timeout value is negative");
2. join(0),進入迴圈:
while (isAlive()) {
wait(0);
}
那麼isAlive是什麼意思呢? isAlive是指子線程start並且run方法還沒執行完,子線程是活著的,所以如果你在子線程start之前,調用join方法,是沒任何效果的,此時子線程是死的。
3.join(time),進入迴圈:
while (isAlive()) {
long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; }
代碼意思:
第一種:子線程執行時間長度不需要time時間長度,那麼父線程就可能不會等待到time時間長度,迴圈條件isAlive()=false,父線程出來了
第二種:子線程執行時間長度超過time時間長度,那麼父線程的等待時間長度,至少是time時間長度,父線程break出來的。
總結:
你要記住的唯一結論是:父線程肯定會等子線程執行一段時間,至於這段時間是多少?要區別看待,
join(0)時:肯定是等到子線程執行完,父線程再執行;
join(time)時:等到子線程執行完 或者 至少等time時間長度,父線程再執行。
java線程Thread的join方法。