一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JAVA多線程CountDownLatch使用詳解

JAVA多線程CountDownLatch使用詳解

2021-03-29 10:07隊長給我球。 Java教程

這篇文章主要介紹了JAVA多線程CountDownLatch的使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前序:

上周測試給開發的同事所開發的模塊提出了一個bug,并且還是偶現。

經過仔細查看代碼,發現是在業務中啟用了多線程,2個線程同時跑,但是新啟動的2個線程必須保證一個完成之后另一個再繼續運行,才能消除bug。

什么時候用?

多線程是在很多地方都會用到的,但是我們如果想要實現在某個特定的線程運行完之后,再啟動另外一個線程呢,這個時候CountDownLatch就可以派上用場了

怎么用?

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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類內部又寫了一個MyThread1類,同樣也是繼承了Thread類,并且在run方法里面讓它睡1秒,這樣運行代碼,就會打印出:

JAVA多線程CountDownLatch使用詳解

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

現在,在代碼中加上CountDownLatch ,要讓MyThread1先運行完畢,再讓MyThread繼續運行。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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一個CountDownLatch對象入參設置為1(我個人理解的這個就像是new一個數組一樣,什么時候數組清空了,那就可以讓被中斷的線程繼續運行了)

2、在MyThread類中調用countDownLatch.await();讓當前線程停止運行。

3、在Mythread1類中調用countDownLatch.countDown()方法。當Mythread1全部執行完畢,再最后調用該方法,作用就是把我說的“數組”清空。

看看輸出的打印結果

JAVA多線程CountDownLatch使用詳解

結果如上圖,是符合預期的結果的。

最后再說下CountDownLatch countDownLatch = new CountDownLatch(1)的入參,這塊設置的是1,那就需要調用一次countDownLatch.countDown()減去1。

如果是其他數字,那就要調用相應的次數,否則調用countDownLatch.await()的線程都不會被繼續執行。

 以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/JJJ1990/p/8328319.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩日日日| 亚洲 欧美 中文 日韩欧美 | 国产普通话对白露脸流出 | 我的妹妹最近有点怪在线观看 | pornohd老师18 | 被老头肉至怀孕小说 | 成人免费观看www视频 | 日本一区视频 | 国产一级毛片潘金莲的奶头 | 欧美日韩一区二区三区免费 | chaopeng在线观看 | 97超pen个人视频公开视频视 | 久久精品国产色蜜蜜麻豆国语版 | 精品国产精品国产 | 五月色婷婷在线影院 | 脱了白丝校花的内裤猛烈进入 | 国产成人h视频在线播放网站 | 韩国伦理hd| 精品一区二区三区高清免费观看 | 513热点网深夜影院影院诶 | 天天干天天爽天天操 | 亚洲日本aⅴ片在线观看香蕉 | 男人天堂色男人 | nxgx国产| 奇米影视久久777中文字幕 | 精品一区二区三区五区六区 | 国产成人综合亚洲一区 | 欧美巨吊 | 毛片免费网站 | 欧洲美女啪啪 | 欧美在线视频7777kkkk | 国产成人精品高清免费 | 2018天天弄| 青草青青在线视频 | 免费成人在线观看视频 | 白丝憋尿| 天天曰| 2021麻豆剧果冻传媒入口永久 | 国产精品嫩草影院在线看 | 女生被草 | 四虎影视国产精品婷婷 |