線程-join();
阿新 • • 發佈:2017-06-11
class read 當前 bottom pos range run obj final
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<length;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
*/
做事不能急,給自己一個大方向後總得一步一步來
一、join()方法,官方描述 waits for this thread to die 等待當前線程死亡; 源碼: //無參,默認調用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; } } } 二、應用,比如幾個線程要按一定順序執行
線程-join();