欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2022年04月15日 16:55:06   作者:派大大大星?  
這篇文章主要介紹了Java并發(fā)編程同步器CountDownLatch,文章基于Java并發(fā)編程的相關(guān)資料展開具有一定的參考價(jià)值,需要的小伙伴可以參考一下

CountDownLatch

在日常開發(fā)中經(jīng)常會(huì)遇到需要在主線程中開啟多個(gè)線程去并行執(zhí)行任務(wù),并且主線程需要等待所有子線程執(zhí)行完畢后再進(jìn)行匯總的場景。在 CountDownLatch 出現(xiàn)之前般都使用線程的join()方法來實(shí)現(xiàn)這一點(diǎn),但是 join 方法不夠靈活,不能夠滿足不同場景的需要,所以 JDK 開發(fā)組提供了 CountDownLatch 這個(gè)類,我們前面介紹的例子使用 CoumtDownLatch 會(huì)更優(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!");
    }

}

image.png

在如上代碼中,創(chuàng)建了一個(gè) CountDownLatch 實(shí)例,因?yàn)橛袃蓚€(gè)子線程所以構(gòu)造函數(shù)的傳參為2。主線程調(diào)用countDownLatch.await()方法后會(huì)被阻塞。子線程執(zhí)行完畢后調(diào)用 countDownLatch.countDown()方法讓 countDownLatch 內(nèi)部的計(jì)數(shù)器減1,所有子線程執(zhí)行完畢并調(diào)用 countDown()方法后計(jì)數(shù)器會(huì)變?yōu)?,這時(shí)候主線程的await()方法才會(huì)返回。其實(shí)上面的代碼還不夠優(yōu)雅,在項(xiàng)目實(shí)踐中一般都避免直接操作線程,而是使用 ExceutorService線程池來管理,使用ExcsuIwsnise時(shí)傳遞的參數(shù)是 Runable 或者 Callable對象,這時(shí)候你沒有辦法直接調(diào)用這些線程的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 JoinCountDownLatch2 {

    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();
    }

}

image.png

最后總結(jié)一下CountDownLatch與join()的區(qū)別。一個(gè)區(qū)別是,調(diào)用一個(gè)子線程的join()方法后,該線程會(huì)一直被阻塞直到子線程運(yùn)行完畢,而 CountDownLatch 則使用計(jì)數(shù)器來允許子線程運(yùn)行完畢或者在運(yùn)行中遞減計(jì)數(shù),也就是 CountDownLach 可以在子線程運(yùn)行的任何時(shí)候讓 await() 方法返回而不一定必須等到線程結(jié)東。另外,使用線程池來管理線程時(shí)一般都是直接添加 Runable 到線程池,這時(shí)候就沒有辦法再調(diào)用線程的 join 方法了,就是說 counDownLatch 相比 join 方法讓我們對線程同步有更靈活的控制。

到此這篇關(guān)于Java并發(fā)編程同步器CountDownLatch的文章就介紹到這了,更多相關(guān)Java CountDownLatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis之GEO存儲(chǔ)地理位置信息的使用

    Redis之GEO存儲(chǔ)地理位置信息的使用

    在外賣軟件中的附近的美食店鋪、外賣小哥的距離,打車軟件附近的車輛,交友軟件中附近的小姐姐。我們都可以利用redis的GEO地理位置計(jì)算得出。本文就來詳細(xì)的介紹一下
    2021-10-10
  • 淺談@Aspect@Order各個(gè)通知的執(zhí)行順序

    淺談@Aspect@Order各個(gè)通知的執(zhí)行順序

    這篇文章主要介紹了@Aspect@Order各個(gè)通知的執(zhí)行順序,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 淺談Java中的高精度整數(shù)和高精度小數(shù)

    淺談Java中的高精度整數(shù)和高精度小數(shù)

    本篇文章主要介紹了淺談Java中的高精度整數(shù)和高精度小數(shù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • JavaFx實(shí)現(xiàn)拼圖游戲

    JavaFx實(shí)現(xiàn)拼圖游戲

    這篇文章主要為大家詳細(xì)介紹了JavaFx實(shí)現(xiàn)拼圖游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • java策略枚舉:消除在項(xiàng)目里大批量使用if-else的優(yōu)雅姿勢

    java策略枚舉:消除在項(xiàng)目里大批量使用if-else的優(yōu)雅姿勢

    這篇文章主要給大家介紹了關(guān)于Java徹底消滅if-else的8種方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2021-06-06
  • Java并發(fā)編程之ReentrantLock解析

    Java并發(fā)編程之ReentrantLock解析

    這篇文章主要介紹了Java并發(fā)編程之ReentrantLock解析,ReentrantLock內(nèi)容定義了一個(gè)抽象類Sync,繼承自AQS,而不是自己去繼承AQS,所有對ReentrantLock的操作都會(huì)轉(zhuǎn)化為對Sync的操作,需要的朋友可以參考下
    2023-12-12
  • 詳解Java編程中Annotation注解對象的使用方法

    詳解Java編程中Annotation注解對象的使用方法

    這篇文章主要介紹了Java編程中Annotation注解對象的使用方法,注解以"@注解名"的方式被編寫,與類、接口、枚舉是在同一個(gè)層次,需要的朋友可以參考下
    2016-03-03
  • Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié)

    Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié)

    這篇文章主要介紹了Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • SpringMvc定制化深入探究原理

    SpringMvc定制化深入探究原理

    SpringMVC是一種基于Java,實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式,請求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦,這篇文章主要介紹了SpringMvc定制化原理
    2022-10-10
  • SpringBoot中整合MyBatis-Plus的方法示例

    SpringBoot中整合MyBatis-Plus的方法示例

    這篇文章主要介紹了SpringBoot中整合MyBatis-Plus的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評論