溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java線程方法join的用法介紹

發布時間:2021-08-19 10:12:36 來源:億速云 閱讀:193 作者:chen 欄目:編程語言

這篇文章主要介紹“java線程方法join的用法介紹”,在日常操作中,相信很多人在java線程方法join的用法介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java線程方法join的用法介紹”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、作用

Thread類中的join方法的主要作用就是同步,它可以使得線程之間的并行執行變為串行執行。具體看代碼:

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);    }  }}

上面程序結果是先打印完小明線程,在打印小東線程;

上面注釋也大概說明了join方法的作用:在A線程中調用了B線程的join()方法時,表示只有當B線程執行完畢時,A線程才能繼續執行。注意,這里調用的join方法是沒有傳參的,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);    }  }}

上面代碼結果是:程序執行前面10毫秒內打印的都是小明線程,10毫秒后,小明和小東程序交替打印。

所以,join方法中如果傳入參數,則表示這樣的意思:如果A線程中掉用B線程的join(10),則表示A線程會等待B線程執行10毫秒,10毫秒過后,A、B線程并行執行。需要注意的是,jdk規定,join(0)的意思不是A線程等待B線程0秒,而是A線程等待B線程無限時間,直到B線程執行完畢,即join(0)等價于join()。

二、join與start調用順序問題

上面的討論大概知道了join的作用了,那么,入股 join在start前調用,會出現什么后果呢?先看下面的測試結果

public class JoinTest {  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();  }}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方法調用之后調用才有意義。這個也很容易理解:如果一個線程都沒有start,那它也就無法同步了。

三、join方法實現原理

有了上面的例子,我們大概知道join方法的作用了,那么,join方法實現的原理是什么呢?

其實,join方法是通過調用線程的wait方法來達到同步的目的的。例如,A線程中調用了B線程的join方法,則相當于A線程調用了B線程的wait方法,在調用了B線程的wait方法后,A線程就會進入阻塞狀態,具體看下面的源碼:

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方法的原理就是調用相應線程的wait方法進行等待操作的,例如A線程中調用了B線程的join方法,則相當于在A線程中調用了B線程的wait方法,當B線程執行完(或者到達等待時間),B線程會自動調用自身的notifyAll方法喚醒A線程,從而達到同步的目的。

到此,關于“java線程方法join的用法介紹”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女