1. 程式人生 > >線程-join();

線程-join();

class read 當前 bottom pos range run obj final

一、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; } } } 二、應用,比如幾個線程要按一定順序執行
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();