1. 程式人生 > >Java多執行緒join()

Java多執行緒join()

原文出處http://www.cnblogs.com/skywang12345/p/3479275.html

join( )的作用:讓“主執行緒”等待“子執行緒”結束之後才能繼續執行。這句話可能有點晦澀,我們還是通過例子去理解

// 主執行緒
public class Father extends Thread {
    public void run() {
        Son s = new Son();
        s.start();
        s.join();
        ...
    }
}
// 子執行緒
public class Son extends Thread {
    public void run() {
        ...
    }
}
說明:

上面有兩個類Father(主執行緒類)和Son(子執行緒類)。因為Son是在Father中建立並啟動的,所以,Father是主執行緒類,Son是子執行緒類。

在Father主執行緒中,通過new Son()新建“子執行緒s”,接著通過s.start()啟動“子執行緒s”,並且呼叫s.join().在呼叫s.join()之後,Father主執行緒會一直等待,知道“子執行緒s”執行完畢;在“子執行緒s”執行完畢之後,Father主執行緒才能接著執行。這也就是我們所說的“join()”的作用,是讓主執行緒等待子執行緒結束之後才能繼續執行!

join()示例

// JoinTest.java的原始碼
public class JoinTest{ 

    public static void main(String[] args){ 
        try {
            ThreadA t1 = new ThreadA("t1"); // 新建“執行緒t1”

            t1.start();                     // 啟動“執行緒t1”
            t1.join();                        // 將“執行緒t1”加入到“主執行緒main”中,並且“主執行緒main()會等待它的完成”
            System.out.printf("%s finish\n", Thread.currentThread().getName()); 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } 

    static class ThreadA extends Thread{

        public ThreadA(String name){ 
            super(name); 
        } 
        public void run(){ 
            System.out.printf("%s start\n", this.getName()); 

            // 延時操作
            for(int i=0; i <1000000; i++)
               ;

            System.out.printf("%s finish\n", this.getName()); 
        } 
    } 
}
執行結果: t1  start t1  finish main  finish
結果說明: (1)在“主執行緒main”中通過 new ThreadA(“t1”)新建“執行緒t1”。接著通過t1.start()啟動大概“執行緒t1”,並執行t1.join(). (2)執行t1.join()之後,“主執行緒main”會進入“阻塞狀態”等待t1執行結束。“子執行緒t1”結束之後,會喚醒“主執行緒main”,“主執行緒”重新獲取cpu執行權,繼續執行。