最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 線程方法join簡單用法實(shí)例總結(jié)

 更新時(shí)間:2019年11月05日 11:28:35   作者:蒼青浪  
這篇文章主要介紹了java 線程方法join簡單用法,結(jié)合實(shí)例形式總結(jié)分析了Java線程join方法的功能、原理及使用技巧,需要的朋友可以參考下

本文實(shí)例講述了java 線程方法join簡單用法。分享給大家供大家參考,具體如下:

雖然關(guān)于討論線程join方法的博客已經(jīng)很多了,不過個(gè)人感覺挺多都討論得不夠全面,所以我覺得有必要對其進(jìn)行一個(gè)全面的總結(jié)。

一、作用

Thread類中的join方法的主要作用就是同步,它可以使得線程之間的并行執(zhí)行變?yōu)榇袌?zhí)行。具體看代碼:

public class JoinTest {
  public static void main(String [] args) throws InterruptedException {
    ThreadJoinTest t1 = new ThreadJoinTest("小明");
    ThreadJoinTest t2 = new ThreadJoinTest("小東");
    t1.start();
    /**join的意思是使得放棄當(dāng)前線程的執(zhí)行,并返回對應(yīng)的線程,例如下面代碼的意思就是:
     程序在main線程中調(diào)用t1線程的join方法,則main線程放棄cpu控制權(quán),并返回t1線程繼續(xù)執(zhí)行直到線程t1執(zhí)行完畢
     所以結(jié)果是t1線程執(zhí)行完后,才到主線程執(zhí)行,相當(dāng)于在main線程中同步t1線程,t1執(zhí)行完了,main線程才有執(zhí)行的機(jī)會(huì)
     */
    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);
    }
  }
}

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

上面注釋也大概說明了join方法的作用:在A線程中調(diào)用了B線程的join()方法時(shí),表示只有當(dāng)B線程執(zhí)行完畢時(shí),A線程才能繼續(xù)執(zhí)行。注意,這里調(diào)用的join方法是沒有傳參的,join方法其實(shí)也可以傳遞一個(gè)參數(shù)給它的,具體看下面的簡單例子:

public class JoinTest {
  public static void main(String [] args) throws InterruptedException {
    ThreadJoinTest t1 = new ThreadJoinTest("小明");
    ThreadJoinTest t2 = new ThreadJoinTest("小東");
    t1.start();
    /**join方法可以傳遞參數(shù),join(10)表示main線程會(huì)等待t1線程10毫秒,10毫秒過去后,
     * main線程和t1線程之間執(zhí)行順序由串行執(zhí)行變?yōu)槠胀ǖ牟⑿袌?zhí)行
     */
    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);
    }
  }
}

上面代碼結(jié)果是:程序執(zhí)行前面10毫秒內(nèi)打印的都是小明線程,10毫秒后,小明和小東程序交替打印。

所以,join方法中如果傳入?yún)?shù),則表示這樣的意思:如果A線程中掉用B線程的join(10),則表示A線程會(huì)等待B線程執(zhí)行10毫秒,10毫秒過后,A、B線程并行執(zhí)行。需要注意的是,jdk規(guī)定,join(0)的意思不是A線程等待B線程0秒,而是A線程等待B線程無限時(shí)間,直到B線程執(zhí)行完畢,即join(0)等價(jià)于join()。

二、join與start調(diào)用順序問題

上面的討論大概知道了join的作用了,那么,入股 join在start前調(diào)用,會(huì)出現(xiàn)什么后果呢?先看下面的測試結(jié)果

public class JoinTest {
  public static void main(String [] args) throws InterruptedException {
    ThreadJoinTest t1 = new ThreadJoinTest("小明");
    ThreadJoinTest t2 = new ThreadJoinTest("小東");
    /**join方法可以在start方法前調(diào)用時(shí),并不能起到同步的作用
     */
    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);
    }
  }
}

上面代碼執(zhí)行結(jié)果是:小明和小東線程交替打印。

所以得到以下結(jié)論:join方法必須在線程start方法調(diào)用之后調(diào)用才有意義。這個(gè)也很容易理解:如果一個(gè)線程都沒有start,那它也就無法同步了。

三、join方法實(shí)現(xiàn)原理

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

其實(shí),join方法是通過調(diào)用線程的wait方法來達(dá)到同步的目的的。例如,A線程中調(diào)用了B線程的join方法,則相當(dāng)于A線程調(diào)用了B線程的wait方法,在調(diào)用了B線程的wait方法后,A線程就會(huì)進(jìn)入阻塞狀態(tài),具體看下面的源碼:

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方法的原理就是調(diào)用相應(yīng)線程的wait方法進(jìn)行等待操作的,例如A線程中調(diào)用了B線程的join方法,則相當(dāng)于在A線程中調(diào)用了B線程的wait方法,當(dāng)B線程執(zhí)行完(或者到達(dá)等待時(shí)間),B線程會(huì)自動(dòng)調(diào)用自身的notifyAll方法喚醒A線程,從而達(dá)到同步的目的。

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java進(jìn)程與線程操作技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Java?中不全部使用?Static?方法的理由

    Java?中不全部使用?Static?方法的理由

    這篇文章主要介紹了Java?中不全部使用?Static?方法的理由,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Lombok插件的安裝與簡單使用步驟

    Lombok插件的安裝與簡單使用步驟

    這篇文章主要介紹了Lombok插件的安裝與簡單使用步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 如何處理@PathVariable中的特殊字符問題

    如何處理@PathVariable中的特殊字符問題

    這篇文章主要介紹了如何處理@PathVariable中的特殊字符問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java壓縮解壓zip技術(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java壓縮解壓zip技術(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java解壓縮zip - 多個(gè)文件(包括文件夾),對多個(gè)文件和文件夾進(jìn)行壓縮,對復(fù)雜的文件目錄進(jìn)行解壓。壓縮方法使用的是可變參數(shù),可以壓縮1到多個(gè)文件
    2017-05-05
  • Java AQS(AbstractQueuedSynchronizer)源碼解析

    Java AQS(AbstractQueuedSynchronizer)源碼解析

    AbstractQueuedSynchronizer被稱為隊(duì)列同步器,簡稱為大家熟知的AQS,這個(gè)類可以稱作concurrent包的基礎(chǔ)。本文將通過剖析源碼來看看AQS是如何工作的,感興趣的可以了解一下
    2023-02-02
  • mybatis中的if?test判斷入?yún)⒌闹祮栴}

    mybatis中的if?test判斷入?yún)⒌闹祮栴}

    這篇文章主要介紹了mybatis中的if?test判斷入?yún)⒌闹祮栴},具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java?EasyExcel導(dǎo)入帶圖片的完整過程記錄

    Java?EasyExcel導(dǎo)入帶圖片的完整過程記錄

    這篇文章主要介紹了關(guān)于結(jié)合EasyExcel和ApachePOI來實(shí)現(xiàn)Excel數(shù)據(jù)批量導(dǎo)入并讀取圖片的過程,文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • 一文掌握maven??filtering標(biāo)簽

    一文掌握maven??filtering標(biāo)簽

    這篇文章主要介紹了maven??filtering標(biāo)簽,本文通過三種方法給大家講解maven?filtering標(biāo)簽,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • JUnit中獲取測試類及方法的名稱實(shí)現(xiàn)方法

    JUnit中獲取測試類及方法的名稱實(shí)現(xiàn)方法

    這篇文章主要介紹了JUnit中獲取測試類及方法的名稱實(shí)現(xiàn)方法,本文使用了JUnit中提供的TestName實(shí)現(xiàn),不過還有一些編程細(xì)節(jié)需要注意,需要的朋友可以參考下
    2015-06-06
  • Spring?Cloud?Stream實(shí)現(xiàn)數(shù)據(jù)流處理

    Spring?Cloud?Stream實(shí)現(xiàn)數(shù)據(jù)流處理

    Spring?Cloud?Stream的核心是Stream,準(zhǔn)確來講Spring?Cloud?Stream提供了一整套數(shù)據(jù)流走向(流向)的API,?它的最終目的是使我們不關(guān)心數(shù)據(jù)的流入和寫出,而只關(guān)心對數(shù)據(jù)的業(yè)務(wù)處理,本文給大家介紹了Spring?Cloud?Stream實(shí)現(xiàn)數(shù)據(jù)流處理,需要的朋友可以參考下
    2024-11-11

最新評論

祁连县| 灵台县| 枣阳市| 荥经县| 内丘县| 丰台区| 绥芬河市| 凤台县| 河源市| 韩城市| 镇远县| 萨迦县| 潞西市| 天峨县| 青川县| 揭西县| 新宁县| 塔河县| 天全县| 海门市| 永济市| 怀仁县| 滦平县| 保靖县| 南康市| 永胜县| 湘阴县| 金昌市| 农安县| 陇南市| 南投市| 宜宾市| 固原市| 钟祥市| 罗江县| 大石桥市| 万州区| 玉环县| 尖扎县| 长子县| 沐川县|