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

JAVA多線程CountDownLatch使用詳解

 更新時(shí)間:2021年04月20日 15:27:08   作者:隊(duì)長(zhǎng)給我球。  
這篇文章主要為大家詳細(xì)介紹了JAVA多線程CountDownLatch的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前序:

上周測(cè)試給開(kāi)發(fā)的同事所開(kāi)發(fā)的模塊提出了一個(gè)bug,并且還是偶現(xiàn)。

經(jīng)過(guò)仔細(xì)查看代碼,發(fā)現(xiàn)是在業(yè)務(wù)中啟用了多線程,2個(gè)線程同時(shí)跑,但是新啟動(dòng)的2個(gè)線程必須保證一個(gè)完成之后另一個(gè)再繼續(xù)運(yùn)行,才能消除bug。

什么時(shí)候用?

多線程是在很多地方都會(huì)用到的,但是我們?nèi)绻胍獙?shí)現(xiàn)在某個(gè)特定的線程運(yùn)行完之后,再啟動(dòng)另外一個(gè)線程呢,這個(gè)時(shí)候CountDownLatch就可以派上用場(chǎng)了

怎么用?

先看看普通的多線程代碼:

package code;

public class MyThread extends Thread { 
  public static void main(String[] args) {   
    MyThread th = new MyThread();  
    Thread t1 = new Thread(th, "Mythread");    
    t1.start(); 
    System.out.println(Thread.currentThread().getName()); 
    }    
    public void run() 
      {   
        Mythread1 th2 = new Mythread1();  
        Thread t2 = new Thread(th2, "Mythread1");    
        t2.start(); 
        System.out.println(this.currentThread().getName()); 
      } 
    class Mythread1 extends Thread
    {
      public void run() {  
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        System.out.println(this.currentThread().getName()); 
        } 
      
    }
  }

代碼如上,先用MyThread繼承了Thread類,然后在MyThread類內(nèi)部又寫了一個(gè)MyThread1類,同樣也是繼承了Thread類,并且在run方法里面讓它睡1秒,這樣運(yùn)行代碼,就會(huì)打印出:

從上面的輸出順序可以看出,先是啟動(dòng)了main線程,然后再啟動(dòng)了MyThread線程,在MyThread線程中,又啟動(dòng)了MyThread1線程。但是由于讓MyThread1線程睡了1秒,模擬處理后續(xù)業(yè)務(wù),這樣他就比MyThread運(yùn)行完畢的時(shí)間晚一些。

現(xiàn)在,在代碼中加上CountDownLatch ,要讓MyThread1先運(yùn)行完畢,再讓MyThread繼續(xù)運(yùn)行。

package code;

import java.util.concurrent.CountDownLatch;

public class MyThread extends Thread { 
  CountDownLatch countDownLatch = new CountDownLatch(1);
  public static void main(String[] args) {   
    MyThread th = new MyThread();  
    Thread t1 = new Thread(th, "Mythread");    
    t1.start(); 
    System.out.println(Thread.currentThread().getName()); 
    }    
    public void run() 
      {   
        Mythread1 th2 = new Mythread1();  
        Thread t2 = new Thread(th2, "Mythread1");    
        t2.start(); 
        try {
          countDownLatch.await();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println(this.currentThread().getName()); 
      } 
    class Mythread1 extends Thread
    {
      public void run() {  
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println(this.currentThread().getName()); 
        countDownLatch.countDown();
        } 
      
    }
  }

代碼寫法如上所示,大致分三步

1、我們先new一個(gè)CountDownLatch對(duì)象入?yún)⒃O(shè)置為1(我個(gè)人理解的這個(gè)就像是new一個(gè)數(shù)組一樣,什么時(shí)候數(shù)組清空了,那就可以讓被中斷的線程繼續(xù)運(yùn)行了)

2、在MyThread類中調(diào)用countDownLatch.await();讓當(dāng)前線程停止運(yùn)行。

3、在Mythread1類中調(diào)用countDownLatch.countDown()方法。當(dāng)Mythread1全部執(zhí)行完畢,再最后調(diào)用該方法,作用就是把我說(shuō)的“數(shù)組”清空。

看看輸出的打印結(jié)果

結(jié)果如上圖,是符合預(yù)期的結(jié)果的。

最后再說(shuō)下CountDownLatch countDownLatch = new CountDownLatch(1)的入?yún)?,這塊設(shè)置的是1,那就需要調(diào)用一次countDownLatch.countDown()減去1。

如果是其他數(shù)字,那就要調(diào)用相應(yīng)的次數(shù),否則調(diào)用countDownLatch.await()的線程都不會(huì)被繼續(xù)執(zhí)行。

 以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)ModbusTCP通信功能

    Java實(shí)現(xiàn)ModbusTCP通信功能

    使用ModbusTCP實(shí)現(xiàn)和硬件設(shè)備通信功能,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-08-08
  • 全網(wǎng)最詳細(xì)Hutool工具詳解

    全網(wǎng)最詳細(xì)Hutool工具詳解

    Hutool的目標(biāo)是使用一個(gè)工具方法代替一段復(fù)雜代碼,從而最大限度的避免“復(fù)制粘貼”代碼的問(wèn)題,徹底改變我們寫代碼的方式。這篇文章主要介紹了全文最詳細(xì)Hutool工具詳解,需要的朋友可以參考下
    2021-12-12
  • 詳解JAVA調(diào)用WCF服務(wù)的示例代碼

    詳解JAVA調(diào)用WCF服務(wù)的示例代碼

    這篇文章主要介紹了詳解JAVA調(diào)用WCF服務(wù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Spring中的@PostConstruct注解使用方法解析

    Spring中的@PostConstruct注解使用方法解析

    這篇文章主要介紹了Spring中的@PostConstruct注解使用方法解析,@PostConstruct注解是用來(lái)處理在@Autowired注入屬性后init()方法之前,對(duì)一些零散的屬性進(jìn)行賦值的注解,需要的朋友可以參考下
    2023-11-11
  • SpringBoot集成Apache POI實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出

    SpringBoot集成Apache POI實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出

    Apache POI是一個(gè)流行的Java庫(kù),用于處理Microsoft Office格式文件,包括Excel文件,本文主要介紹了SpringBoot集成Apache POI實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • Java ExecutorServic線程池異步實(shí)現(xiàn)流程

    Java ExecutorServic線程池異步實(shí)現(xiàn)流程

    這篇文章主要介紹了Java ExecutorServic線程池異步實(shí)現(xiàn)流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問(wèn)題及解決

    基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot中maven項(xiàng)目打成war包部署在linux服務(wù)器上的方法

    SpringBoot中maven項(xiàng)目打成war包部署在linux服務(wù)器上的方法

    這篇文章主要介紹了SpringBoot中maven項(xiàng)目打成war包部署在linux服務(wù)器上的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 詳解Struts2標(biāo)簽遍歷

    詳解Struts2標(biāo)簽遍歷

    這篇文章主要介紹了Struts2標(biāo)簽遍歷,以及相關(guān)的用法示例,需要的朋友可以參考下。
    2017-09-09
  • java FastJson的簡(jiǎn)單用法

    java FastJson的簡(jiǎn)單用法

    FastJson是阿里的開(kāi)源JSON解析庫(kù),可以解析JSON格式的字符串,支持將Java Bean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean,這里我介紹一下FastJson的使用,感興趣的朋友一起看看吧
    2021-09-09

最新評(píng)論

巧家县| 五河县| 论坛| 遂溪县| 光山县| 德兴市| 文水县| 得荣县| 高尔夫| 济阳县| 深圳市| 万山特区| 鹤峰县| 安平县| 通河县| 营山县| 保定市| 吴堡县| 涞源县| 会东县| 岑巩县| 泗水县| 都安| 肃北| 蒙山县| 七台河市| 东阳市| 若羌县| 大理市| 东莞市| 荣成市| 伽师县| 鹤岗市| 黄石市| 蕉岭县| 内丘县| 富锦市| 南充市| 腾冲县| 文水县| 卢龙县|