最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程循環(huán)柵欄CyclicBarrier正確使用方法

 更新時間:2023年09月24日 09:49:37   作者:呆小魚LQ  
這篇文章主要介紹了Java多線程循環(huán)柵欄CyclicBarrier正確使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

本篇文章的代碼示例已放到 github 上,Git地址為:advance(記錄每一個學習過程),大家把代碼下載下來之后,全局搜索一些關(guān)鍵代碼,即可找到該文章的源碼。

使用場景

想象一個這樣的場景,我們在打王者榮耀/英雄聯(lián)盟的時候,都會有一個匹配機制,需要10個人都加載完成后,大家才能一起進入游戲,不然會出現(xiàn)大家進入游戲的時間不一致的情況,這個時候就可以使用CyclicBarrier來實現(xiàn)。

基本原理

使用CyclicBarrier的線程被叫做參與方,它的內(nèi)部維護了一個顯式鎖。參與方只需要執(zhí)行await()就可以參與等待,此時這些線程會被暫停。當最后一個線程執(zhí)行await()方法后,其他被暫停的線程都會被喚醒,而最后一個線程不會被暫停。

常用方法

//構(gòu)造器,定義參與的線程數(shù)
CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
//構(gòu)造器,可以傳入跳柵后需要執(zhí)行的線程
public CyclicBarrier(int parties, Runnable barrierAction);
//將屏障重置為其初始狀態(tài)
void reset()
//進行等待
int await()
//進行等待,同時具備超時時間
public int await(long timeout, TimeUnit unit)

使用示例

定義玩家運行程序

public class CyclicBarrierRunnable implements Runnable{
    private CyclicBarrier cyclicBarrier;
    private int number;
    public CyclicBarrierRunnable(CyclicBarrier cyclicBarrier, int number) {
        this.cyclicBarrier = cyclicBarrier;
        this.number = number;
    }
    @Override
    public void run() {
        System.out.println("玩家" + number + "號正在加載游戲...");
        try {
            TimeUnit.SECONDS.sleep(2);
            cyclicBarrier.await();
        } catch (Exception e) {
            System.out.println("線程執(zhí)行出現(xiàn)問題");
        }
        System.out.println("玩家" + number + "號加載完成。");
    }
}

定義主程序

public class Main {
    public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
        //獲取參與方的總數(shù)
        System.out.println("參與方的總數(shù)為:" + cyclicBarrier.getParties());
        //獲取此時等待的線程數(shù)
        System.out.println("此時等待的線程數(shù)為:" + cyclicBarrier.getNumberWaiting());
        for (int i = 0; i < 10; i++){
            CyclicBarrierRunnable runnable = new CyclicBarrierRunnable(cyclicBarrier, i);
            new Thread(runnable).start();
        }
    }
}

運行結(jié)果

執(zhí)行說明

主線程每隔2秒會啟動一個子線程執(zhí)行,子線程打印“準備執(zhí)行”后,會調(diào)用await()方法進行等待,從結(jié)果我們可以看出:當最后一個CyclicBarrier.await()方法被執(zhí)行后,所有的等待線程同時被喚醒,同時開始執(zhí)行。

內(nèi)部原理

CyclicBarrier內(nèi)部使用了一個條件變量trip來實現(xiàn)等待/通知。

CyclicBarrier內(nèi)部實現(xiàn)使用了分代的概念用于表示CyclicBarrier實例是可以重復使用的。

除最后一個線程外的任何一個參與方都相當于一個等待線程,這些線程所使用的保護條件是:“當前分代內(nèi),尚未執(zhí)行await方法的參與方個數(shù)為0”。await()方法每被執(zhí)行一次,相應(yīng)實例的parties值會減少1.最后一個線程相當于通知線程,它執(zhí)行await()會使相應(yīng)實例的parties的值變?yōu)?,此線程會先執(zhí)行barrierAction.run(),然后再執(zhí)行trip.signalAll()來喚醒所有等待線程。

注意事項

  • 使用reset()方法將屏障置為初始狀態(tài)時,如果所有參與者目前都在屏障處等待,則將他們喚醒,同時拋出一個BrokenBarrierException異常

以上就是Java多線程循環(huán)柵欄CyclicBarrier正確使用方法的詳細內(nèi)容,更多關(guān)于Java多線程循環(huán)柵欄CyclicBarrier的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring?boot詳解fastjson過濾字段為null值如何解決

    Spring?boot詳解fastjson過濾字段為null值如何解決

    這篇文章主要介紹了解決Spring?boot中fastjson過濾字段為null值的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • IDEA之IDEA連接gitlab協(xié)同開發(fā)方式

    IDEA之IDEA連接gitlab協(xié)同開發(fā)方式

    通過IDEA克隆GitLab項目實現(xiàn)代碼協(xié)同開發(fā)相較于使用SourceTree,?通過IDEA連接GitLab進行代碼協(xié)同開發(fā)更顯便捷,方法包括通過VersionControl創(chuàng)建新項目,輸入項目的git?HTTP地址和本地路徑,測試連接成功后克隆項目,修改代碼后
    2024-11-11
  • 一文搞懂Java正則表達式的使用

    一文搞懂Java正則表達式的使用

    正則表達式,又稱規(guī)則表達式,是一種文本模式。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串,通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。本文將通過示例為大家詳細說說Java正則表達式的使用,感興趣的可以了解一下
    2022-08-08
  • springboot項目訪問圖片的3種實現(xiàn)方法(親測可用)

    springboot項目訪問圖片的3種實現(xiàn)方法(親測可用)

    本文主要介紹了springboot項目訪問圖片的3種實現(xiàn)方法,通過springboot項目訪問除項目根目錄之外的其它目錄的圖片,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 淺談MyBatis原生批量插入的坑與解決方案

    淺談MyBatis原生批量插入的坑與解決方案

    本文主要介紹了淺談MyBatis原生批量插入的坑與解決方案,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • mybatis-plus排除非表中字段的操作

    mybatis-plus排除非表中字段的操作

    這篇文章主要介紹了mybatis-plus排除非表中字段的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 使用Maven中的scope總結(jié)

    使用Maven中的scope總結(jié)

    這篇文章主要介紹了使用Maven中的scope總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 關(guān)于消息中間件RocketMQ的基本概念及功能

    關(guān)于消息中間件RocketMQ的基本概念及功能

    這篇文章主要介紹了關(guān)于消息中間件RocketMQ的基本概念及功能,RocketMQ作為一款純java、分布式、隊列模型的開源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時消息、消息回溯等,需要的朋友可以參考下
    2023-05-05
  • 分析Java中Map的遍歷性能問題

    分析Java中Map的遍歷性能問題

    隨著JDK 1.8 Streams API的發(fā)布,使得HashMap擁有了更多的遍歷的方式,但應(yīng)該選擇那種遍歷方式?反而成了一個問題。本文從幾個方面來分析 HashMap各種遍歷方式的優(yōu)勢與不足
    2021-06-06
  • Java集合之整體結(jié)構(gòu)

    Java集合之整體結(jié)構(gòu)

    Java中集合類是Java編程中使用最頻繁、最方便的類。接下來通過本文給大家介紹Java集合之整體結(jié)構(gòu),一起看看吧
    2016-05-05

最新評論

松阳县| 武山县| 阿合奇县| 津南区| 康保县| 枣强县| 施甸县| 乌拉特前旗| 两当县| 资阳市| 东明县| 临朐县| 元谋县| 彭泽县| 台江县| 台江县| 无极县| 新密市| 阜南县| 来宾市| 股票| 陆丰市| 邻水| 朔州市| 甘德县| 芜湖县| 三河市| 大洼县| 瑞昌市| 龙游县| 宜阳县| 屯留县| 内江市| 轮台县| 绥滨县| 内丘县| 日土县| 织金县| 定远县| 贡嘎县| 石柱|