亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JAVA多線程CountDownLatch使用詳解

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

前序:

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

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

什么時候用?

多線程是在很多地方都會用到的,但是我們?nèi)绻胍獙崿F(xiàn)在某個特定的線程運行完之后,再啟動另外一個線程呢,這個時候CountDownLatch就可以派上用場了

怎么用?

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

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)部又寫了一個MyThread1類,同樣也是繼承了Thread類,并且在run方法里面讓它睡1秒,這樣運行代碼,就會打印出:

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

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

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對象入?yún)⒃O置為1(我個人理解的這個就像是new一個數(shù)組一樣,什么時候數(shù)組清空了,那就可以讓被中斷的線程繼續(xù)運行了)

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

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

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

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

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

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

 以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論