thread.join

Thread類中的join方法的主要做用就是同步,它能夠使得線程之間的並行執行變爲串行執行。java

public class JoinTest {
    public static void main(String [] args) throws InterruptedException {
        ThreadJoinTest t1 = new ThreadJoinTest("小明");
        ThreadJoinTest t2 = new ThreadJoinTest("小東");
        t1.start();
        /**join的意思是使得放棄當前線程的執行,並返回對應的線程,例以下面代碼的意思就是:
         程序在main線程中調用t1線程的join方法,則main線程放棄cpu控制權,並返回t1線程繼續執行直到線程t1執行完畢
         因此結果是t1線程執行完後,纔到主線程執行,至關於在main線程中同步t1線程,t1執行完了,main線程纔有執行的機會
         */
        t1.join();
        t2.start();
    }

}
class ThreadJoinTest extends Thread{
    public ThreadJoinTest(String name){
        super(name);
    }
    @Override
    public void run(){
        for(int i=0;i<1000;i++){
            System.out.println(this.getName() + ":" + i);
        }
    }
}
  • 帶參數調用
    • 須要注意的是,jdk規定,join(0)的意思不是A線程等待B線程0秒,而是A線程等待B線程無限時間,直到B線程執行完畢,
    • 即join(0)等價於join()
public class JoinTest {
    public static void main(String [] args) throws InterruptedException {
        ThreadJoinTest t1 = new ThreadJoinTest("小明");
        ThreadJoinTest t2 = new ThreadJoinTest("小東");
        t1.start();
        /**join方法能夠傳遞參數,join(10)表示main線程會等待t1線程10毫秒,10毫秒過去後,
         * main線程和t1線程之間執行順序由串行執行變爲普通的並行執行
         */
        t1.join(10);
        t2.start();
    }

}
class ThreadJoinTest extends Thread{
    public ThreadJoinTest(String name){
        super(name);
    }
    @Override
    public void run(){
        for(int i=0;i<1000;i++){
            System.out.println(this.getName() + ":" + i);
        }
    }
}
  • 若是join方法能夠在start方法前調用時,並不能起到同步的做用
public static void main(String [] args) throws InterruptedException {
        ThreadJoinTest t1 = new ThreadJoinTest("小明");
        ThreadJoinTest t2 = new ThreadJoinTest("小東");
        /**join方法能夠在start方法前調用時,並不能起到同步的做用
         */
        t1.join();
        t1.start();
        //Thread.yield();
        t2.start();
    }

join方法實現原理ide

  • join方法是經過調用線程的wait方法來達到同步的目的的
    • 例如A線程中調用了B線程的join方法,
    • 則至關於在A線程中調用了B線程的wait方法,當B線程執行完(或者到達等待時間),
    • B線程會自動調用自身的notifyAll方法喚醒A線程,從而達到同步的目的。

相關文章
相關標籤/搜索