//無參,預設呼叫join(0)
public final void join() throws InterruptedException {
join(0);
}
//傳入兩時間millis 毫秒+nanos奈秒,表示等等millis+nanos,最後還是呼叫了方法3
public final synchronized void join(long millis, int nanos)
throws InterruptedException {
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && millis = = 0)) {
millis++;
}
join(millis);
}
#//方法3:傳入等時間,單位為毫秒,底層呼叫Object的wait(time)
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) {
#while (isAlive()) {
wait(0);//表示一直等待,指導線程死亡
}
} else {
while ( isAlive()) {
long delay = millis - now;
#if (delay <= 0) {
break;
#}
wait(delay);
now = System.currentTimeMillis() - base;
}
##}
##}
#
public class ThreadJoin extends Thread {
public void run(){
#try {
this.sleep(500);
System.out.println("["+new Date()+"]"+this.getName());
#
} catch (InterruptedException e) {
e.printStackTrace();
}
}
#
public static void main(String[] args) throws Exception {
int length = 5;
##Thread[] threads = new Thread[length];
for(int i=0; i
threads[i] = new ThreadJoin();
threads[i].start() ;
threads[i].join();//每個執行緒開啟後都會呼叫join
}
long endTime=System.currentTimeMillis();
}
}
/*
output:
[Sun Jun 11 13:40:42 CST 2017]Thread-0
[Sun Jun 11 13:40:43 CST 2017]Thread-1
[Sun Jun 11 13:40:43 CST 2017]Thread-2
[Sun Jun 11 13:40:44 CST 2017]Thread-3
[Sun Jun 11 13:40:44 CST 2017]Thread-4
## 如果把join()註解結果可能每次都不一樣[Sun Jun 11 13:51:09 CST 2017]Thread-2
[Sun Jun 11 13:51:09 CST 2017]Thread-4[Sun Jun 11 13:51:09 CST 2017]Thread-1
[Sun Jun 11 13 :51:09 CST 2017]Thread-3
[Sun Jun 11 13:51:09 CST 2017]Thread-0