溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

CountDownLatch怎么在JAVA中使用

發(fā)布時(shí)間:2021-03-29 17:00:39 來源:億速云 閱讀:172 作者:Leah 欄目:編程語言

本篇文章為大家展示了CountDownLatch怎么在JAVA中使用,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

什么時(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 th3 = new Mythread1();  
        Thread t2 = new Thread(th3, "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ì)打印出:

CountDownLatch怎么在JAVA中使用

從上面的輸出順序可以看出,先是啟動(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 th3 = new Mythread1();  
        Thread t2 = new Thread(th3, "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)用該方法,作用就是把我說的“數(shù)組”清空。

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

CountDownLatch怎么在JAVA中使用

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

最后再說下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í)行。

上述內(nèi)容就是CountDownLatch怎么在JAVA中使用,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI