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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99热这里只有精品一区二区三区 | 色婷婷综合久久久中文字幕 | 男男按摩1069gⅴ | 欧美性一区二区三区 | 99热久久这里只有精品6国产网 | 日韩欧美在线观看综合网另类 | 欧美成黑人性猛交xxoo | 日本一区二区视频在线 | 国产欧美日韩精品一区二 | 午夜AV国产欧美亚洲高清在线 | 日本高清视频网址 | 成人福利网站 | 狠狠色婷婷狠狠狠亚洲综合 | 手机在线免费观看视频 | 非洲黑人gay巨大 | hezyo加勒比一区二区三区 | 无码AV精品一区二区三区 | 国内精品免费 | 99青青青精品视频在线 | 9966久久精品免费看国产 | 操穴勤| 日韩毛片免费在线观看 | 午夜一级免费视频 | 国产aaaaa一级毛片 | 亚洲精品无码不卡在线观看 | 午夜福利院电影 | 国产日韩欧美综合一区二区三区 | 精品国产区一区二区三区在线观看 | 欧美整片完整片视频在线 | 国产日韩欧美在线播放 | 天堂资源wwww在线看 | 亚洲AV无码国产精品午夜久久 | 九九精品视频在线免费观看 | 国产专区视频在线观看 | 久久国产加勒比精品无码 | 秋霞综合网 | 色综合视频在线观看 | 午夜桃色剧场 | 97就去干| tubehdxx丝袜正片 | 白白国产永久免费视频 |