溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java并發(fā)編程同步器CountDownLatch怎么用

發(fā)布時間:2022-04-16 09:05:31 來源:億速云 閱讀:138 作者:iii 欄目:開發(fā)技術

今天小編給大家分享一下Java并發(fā)編程同步器CountDownLatch怎么用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

CountDownLatch

在日常開發(fā)中經常會遇到需要在主線程中開啟多個線程去并行執(zhí)行任務,并且主線程需要等待所有子線程執(zhí)行完畢后再進行匯總的場景。在 CountDownLatch 出現(xiàn)之前般都使用線程的join()方法來實現(xiàn)這一點,但是 join 方法不夠靈活,不能夠滿足不同場景的需要,所以 JDK 開發(fā)組提供了 CountDownLatch 這個類,我們前面介紹的例子使用 CoumtDownLatch 會更優(yōu)雅。

使用CountDownLatch 的代碼如下:

package LockSupportTest;

import java.util.concurrent.CountDownLatch;

public class JoinCountDownLatch {

    private static volatile CountDownLatch countDownLatch = new CountDownLatch(2);

    public static void main(String[] args) throws InterruptedException{

        Thread threadOne = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println("child threadOne over!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                }
            }
        });
        
        Thread threadTwo = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println("child threadOne over!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                }
            }
        });

        threadOne.start();
        threadTwo.start();
        System.out.println("wait all child thread over!!!");
        countDownLatch.await();
        System.out.println("all child thread over!");
    }

}

Java并發(fā)編程同步器CountDownLatch怎么用

在如上代碼中,創(chuàng)建了一個 CountDownLatch 實例,因為有兩個子線程所以構造函數(shù)的傳參為2。主線程調用countDownLatch.await()方法后會被阻塞。子線程執(zhí)行完畢后調用 countDownLatch.countDown()方法讓 countDownLatch 內部的計數(shù)器減1,所有子線程執(zhí)行完畢并調用 countDown()方法后計數(shù)器會變?yōu)?,這時候主線程的await()方法才會返回。其實上面的代碼還不夠優(yōu)雅,在項目實踐中一般都避免直接操作線程,而是使用 ExceutorService線程池來管理,使用ExcsuIwsnise時傳遞的參數(shù)是 Runable 或者 Callable對象,這時候你沒有辦法直接調用這些線程的join()方法,這就需要選擇使用CountDownLatch了。

將上面的代碼修改為:

package LockSupportTest;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class JoinCountDownLatch3 {

    private static volatile CountDownLatch countDownLatch = new CountDownLatch(2);

    public static void main(String[] args) throws InterruptedException{

        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println("child threadOne over!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                }
            }
        });
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println("child threadTwo over!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                }
            }
        });
        System.out.println("wait all child thread over!!!");
        countDownLatch.await();
        System.out.println("all child thread over!");
        executorService.shutdown();
    }

}

Java并發(fā)編程同步器CountDownLatch怎么用

以上就是“Java并發(fā)編程同步器CountDownLatch怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI