激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java中CyclicBarrier和CountDownLatch的用法與區別

Java中CyclicBarrier和CountDownLatch的用法與區別

2021-11-29 11:57Deegue Java教程

CyclicBarrier和CountDownLatch這兩個工具都是在java.util.concurrent包下,并且平時很多場景都會使用到。本文將會對兩者進行分析,記錄他們的用法和區別,感興趣的可以了解一下

 

前言

CyclicBarrier和CountDownLatch這兩個工具都是在java.util.concurrent包下,并且平時很多場景都會使用到。
本文將會對兩者進行分析,記錄他們的用法和區別。

 

CountDownLatch

CountDownLatch是一個非常實用的多線程控制工具類,稱之為“倒計時器”,它允許一個或多個線程一直等待,直到其他線程的操作執行完后再執行。

CountDownLatch是通過一個計數器來實現的,計數器的初始值為線程的數量。每當一個線程完成了自己的任務后,計數器的值就會減1。當計數器值到達0時,它表示所有的線程已經完成了任務,然后在閉鎖上等待的線程就可以恢復執行任務。

Java中CyclicBarrier和CountDownLatch的用法與區別

特點

只能一次性使用(不能reset);主線程阻塞;某個線程中斷將永遠到不了屏障點,所有線程都會一直等待。

 

 

例子

 	//創建初始化3個線程的線程池
    private ExecutorService                    threadPool     = Executors.newFixedThreadPool(3);
    //保存每個學生的平均成績
    private ConcurrentHashMap<String, Integer> map            = new ConcurrentHashMap<>();
    private CountDownLatch                     countDownLatch = new CountDownLatch(3);

    private void count() {
        for (int i = 0; i < 3; i++) {
            threadPool.execute(() -> {
                //計算每個學生的平均成績,代碼略()假設為60~100的隨機數
                int score = (int) (Math.random() * 40 + 60);
                try {
                    Thread.sleep(Math.round(Math.random() * 1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                map.put(Thread.currentThread().getName(), score);
                System.out.println(Thread.currentThread().getName() + "同學的平均成績為" + score);
                countDownLatch.countDown();
            });
        }
        this.run();
        threadPool.shutdown();
    }

    @Override
    public void run() {
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        int result = 0;
        Set<String> set = map.keySet();
        for (String s : set) {
            result += map.get(s);
        }
        System.out.println("三人平均成績為:" + (result / 3) + "分");
    }

    public static void main(String[] args) throws InterruptedException {
        long now = System.currentTimeMillis();
        CyclicBarrier1 cb = new CyclicBarrier1();
        cb.count();
        Thread.sleep(100);
        long end = System.currentTimeMillis();
        System.out.println(end - now);
    }

最終輸出結果:

Java中CyclicBarrier和CountDownLatch的用法與區別

其中1194ms證明了會阻塞主線程。

 

CyclicBarrier

CyclicBarrier 的字面意思是可循環使用(Cyclic)的屏障(Barrier)。它要做的事情是,讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最后一個線程到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續干活。

這個屏障之所以用循環修飾,是因為在所有的線程釋放彼此之后,這個屏障是可以重新使用的(reset()方法重置屏障點),這一點與CountDownLatch不同。

CyclicBarrier是一種同步機制允許一組線程相互等待,等到所有線程都到達一個屏障點才退出await方法,它沒有直接實現AQS而是借助ReentrantLock來實現的同步機制。它是可循環使用的,而CountDownLatch是一次性的,另外它體現的語義也跟CountDownLatch不同,CountDownLatch減少計數到達條件采用的是release方式,而CyclicBarrier走向屏障點(await)采用的是Acquire方式,Acquire是會阻塞的,這也實現了CyclicBarrier的另外一個特點,只要有一個線程中斷那么屏障點就被打破,所有線程都將被喚醒(CyclicBarrier自己負責這部分實現,不是由AQS調度的),這樣也避免了因為一個線程中斷引起永遠不能到達屏障點而導致其他線程一直等待。屏障點被打破的CyclicBarrier將不可再使用(會拋出BrokenBarrierException)除非執行reset操作。

 

構造函數

CyclicBarrier有兩個構造函數:

CyclicBarrier(int parties)
int類型的參數表示有幾個線程來參與這個屏障攔截,(拿上面的例子,即有幾個人跟團旅游);

CyclicBarrier(int parties,Runnable barrierAction)
當所有線程到達一個屏障點時,優先執行barrierAction這個線程。

最重要的一個方法:
await();每個線程調用await(),表示我已經到達屏障點,然后當前線程被阻塞。

例子

	//創建初始化3個線程的線程池
    private ExecutorService                    threadPool     = Executors.newFixedThreadPool(3);
    //創建3個CyclicBarrier對象,執行完后執行當前類的run方法
    private CyclicBarrier                      cb             = new CyclicBarrier(3, this);
    //保存每個學生的平均成績
    private ConcurrentHashMap<String, Integer> map            = new ConcurrentHashMap<>();

    private void count() {
        for (int i = 0; i < 3; i++) {
            threadPool.execute(() -> {
                //計算每個學生的平均成績,代碼略()假設為60~100的隨機數
                int score = (int) (Math.random() * 40 + 60);
                try {
                    Thread.sleep(Math.round(Math.random() * 1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                map.put(Thread.currentThread().getName(), score);
                System.out.println(Thread.currentThread().getName() + "同學的平均成績為" + score);
                try {
                    //執行完運行await(),等待所有學生平均成績都計算完畢
                    cb.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            });
        }
        threadPool.shutdown();
    }

    @Override
    public void run() {
        int result = 0;
        Set<String> set = map.keySet();
        for (String s : set) {
            result += map.get(s);
        }
        System.out.println("三人平均成績為:" + (result / 3) + "分");
    }

    public static void main(String[] args) throws InterruptedException {
        long now = System.currentTimeMillis();
        CyclicBarrier1 cb = new CyclicBarrier1();
        cb.count();
        Thread.sleep(100);
        long end = System.currentTimeMillis();
        System.out.println(end - now);
    }

最終輸出結果:

Java中CyclicBarrier和CountDownLatch的用法與區別

顯然沒有阻塞主線程。

 

兩者區別

  • CountDownLatch的計數器只能使用一次。而CyclicBarrier的計數器可以使用reset()
  • 方法重置。所以CyclicBarrier能處理更為復雜的業務場景,比如如果計算發生錯誤,可以重置計數器,并讓線程們重新執行一次。
  • CyclicBarrier還提供其他有用的方法,比如getNumberWaiting方法可以獲得CyclicBarrier阻塞的線程數量。isBroken方法用來知道阻塞的線程是否被中斷。比如以下代碼執行完之后會返回true。
  • CountDownLatch會阻塞主線程,CyclicBarrier不會阻塞主線程,只會阻塞子線程。
  • 某線程中斷CyclicBarrier會拋出異常,避免了所有線程無限等待。

我們來從jdk作者設計的目的來看,javadoc是這么描述它們的:

CountDownLatch:
A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

CyclicBarrier:
A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.

從javadoc的描述可以得出:

CountDownLatch:一個或者多個線程,等待其他多個線程完成某件事情之后才能執行;
CyclicBarrier:多個線程互相等待,直到到達同一個同步點,再繼續一起執行。
對于CountDownLatch來說,重點是“一個線程(多個線程)等待”,而其他的N個線程在完成“某件事情”之后,可以終止,也可以等待。而對于CyclicBarrier,重點是多個線程,在任意一個線程沒有完成,所有的線程都必須等待。

CountDownLatch是計數器,線程完成一個記錄一個,只不過計數不是遞增而是遞減,而CyclicBarrier更像是一個閥門,需要所有線程都到達,閥門才能打開,然后繼續執行。

到此這篇關于Java中CyclicBarrier和CountDownLatch的用法與區別的文章就介紹到這了,更多相關Java CyclicBarrier CountDownLatch內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/zyzzxycj/article/details/90241892

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
主站蜘蛛池模板: 黄色影院在线 | 欧美日韩亚洲一区二区三区 | 亚洲国产精品一区二区精品 | 日产精品久久久一区二区福利 | 奶子吧naiziba.cc免费午夜片在线观看 | 国产精品久久久久久久四虎电影 | 国产又白又嫩又紧又爽18p | 久久久久久久亚洲精品 | 日韩精品中文字幕一区 | 黄色网址进入 | 国产精品区一区二区三区 | 在线日韩| 欧美成人午夜一区二区三区 | 亚洲影视在线 | 久久免费视频3 | 国产一区二区三区视频免费 | 国产免费黄网 | 成人毛片网站 | 久久久视频免费观看 | 日韩黄色影视 | 国产精品亚洲一区二区三区在线观看 | 欧美日韩经典在线 | 色就色 综合偷拍区91网 | 视频一区国产 | 羞羞羞网站 | 草草视频在线播放 | 在线观看免费av网 | 国产精品99久久久久久久女警 | 九色p| 一级空姐毛片 | 毛片在线视频观看 | 色综合网在线观看 | 青热久思思 | 久色精品 | 久久免费视频一区 | 成人h精品动漫一区二区三区 | 性欧美视频在线观看 | 成人福利在线免费观看 | 香蕉国产9 | www.48xx.com| 欧美成人理论片乱 |