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

Java多線程CyclicBarrier的實現(xiàn)代碼

 更新時間:2022年02月17日 14:32:23   作者:胡安民  
CyclicBarrier可以使一定數(shù)量的線程反復地在柵欄位置處匯集,本文通過實例代碼介紹下Java多線程CyclicBarrier的相關(guān)知識,感興趣的朋友一起看看吧

介紹

CyclicBarrier允許一組線程在到達某個柵欄點(common barrier point)互相等待,直到最后一個線程到達柵欄點,柵欄才會打開,處于阻塞狀態(tài)的線程恢復繼續(xù)執(zhí)行。

1.就比如說我們在打王者的時候,十個人必須全部加載到100%,才可以開局。否則只要有一個人沒有加載到100%,那這個游戲就不能開始。先加載完成的玩家必須等待最后一個玩家加載成功才可以。

在這里插入圖片描述

2.你可以想象長途客車,就算你是第一個上車的人,也要等待車滿才可以發(fā)車。否則車上所有人都要等待。

3.在百米賽跑里,比賽沒開始之前,每個運動員都在賽場上自由活動,有的熱身,有的喝水,有的跟教練談?wù)摗1荣惪扉_始時,準備完畢的運動員就預備在起跑線上,如果有個運動員還沒準備完(除去特殊情況),他們就一直等,直到運動員都在起跑線上,裁判喊口號后再開始跑。這里的起跑線就是屏障,做完準備工作的運動員都等在起跑線,直到其他運動員也把準備工作做完。

代碼介紹

接下來我們看看CyclicBarrier它的構(gòu)造器

//構(gòu)造器1
public CyclicBarrier(int parties, Runnable barrierAction) {
  if (parties <= 0) throw new IllegalArgumentException();
  this.parties = parties;
  this.count = parties;
  this.barrierCommand = barrierAction;
}
 
//構(gòu)造器2
public CyclicBarrier(int parties) {
  this(parties, null);
}

CyclicBarrier有兩個構(gòu)造器,第一個構(gòu)造器是它的核心構(gòu)造器

參數(shù)1: 在這里你可以指定本局游戲的參與者數(shù)量(要攔截的線程數(shù))

參數(shù)2: 本局結(jié)束時要執(zhí)行的任務(wù),(也就是所有線程執(zhí)行完后執(zhí)行的線程)

CyclicBarrier供了兩種等待的方法,分別是定時等待和非定時等待。
參數(shù)1 : timeout 時間 , 參數(shù)2: 時間單位 TimeUnit.SECONDS (秒)

//非定時等待 (比如指定3個線程 每一個線程調(diào)用一次內(nèi)部count--  當count==0時 釋放3個線程 然后count重置為3  )
public int await() throws InterruptedException, BrokenBarrierException {
  try {
    return dowait(false, 0L);
  } catch (TimeoutException toe) {
    throw new Error(toe);
  }
}
 
//定時等待 (就是子一定時間內(nèi)如果還沒有 到時間自動喚醒)
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException {
  return dowait(true, unit.toNanos(timeout));
}

重置屏障
將屏障重置到初始狀態(tài)。 如果任何一方目前正在barrier處等待,他們將返回一個BrokenBarrierException。 注意,由于其他原因發(fā)生破損后復位可能會比較復雜; 線程需要以其他方式重新同步,然后選擇一個執(zhí)行重置。 最好是為以后的使用創(chuàng)建一個新的障礙。

public void reset() {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            breakBarrier();   // break the current generation
            nextGeneration(); // start a new generation
        } finally {
            lock.unlock();
        }
    }

案例:王者榮耀游戲加載

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

        //設(shè)置這局游戲的唯一id 和人數(shù)
        CyclicBarrierUtils.initialize("da1",10,()->{
            System.out.println("10人都加載完畢,進入游戲");
        });
        //開始加載游戲
        for (int i = 0; i < 10; i++) {
            int finalI = i;
            ExecutorUtils.create(()->{
                System.out.println(finalI +":加載完畢,等待其他人....");
                CyclicBarrierUtils.await("da1");
            });
        }
    }

代碼經(jīng)過二次封裝,所以看看邏輯就行

如有侵權(quán),請私信聯(lián)系我

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

相關(guān)文章

  • mybatis執(zhí)行錯誤但sql執(zhí)行正常問題

    mybatis執(zhí)行錯誤但sql執(zhí)行正常問題

    這篇文章主要介紹了mybatis執(zhí)行錯誤但sql執(zhí)行正常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java?并發(fā)線程個數(shù)的如何確定

    java?并發(fā)線程個數(shù)的如何確定

    這篇文章主要介紹了java?并發(fā)線程個數(shù)的如何確定,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中的System.getProperty()詳解

    Java中的System.getProperty()詳解

    System.getProperty("XXX")方法用來讀取JVM中的系統(tǒng)屬性,那么java 虛擬機中的系統(tǒng)屬性使用在運行java程序的時候java -D配置,有兩種方式,一種是在命令行配置另一種是在IDE中配置,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2023-09-09
  • 關(guān)于JWT之token令牌認證登錄

    關(guān)于JWT之token令牌認證登錄

    這篇文章主要介紹了關(guān)于JWT之token令牌認證登錄,使用JWT能夠保證Token的安全性,且能夠進行Token時效性的檢驗,使用JWT時,登錄成功后將用戶信息生成一串令牌字符串,需要的朋友可以參考下
    2023-05-05
  • 深入java垃圾回收的詳解

    深入java垃圾回收的詳解

    本篇文章是對java垃圾回收進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • 模仿Spring手寫一個簡易的IOC

    模仿Spring手寫一個簡易的IOC

    這篇文章主要介紹了模仿Spring手寫一個簡易的IOC,幫助大家更好的理解和學習spring框架,感興趣的朋友可以了解下
    2020-11-11
  • JAVA實現(xiàn)感知器算法

    JAVA實現(xiàn)感知器算法

    這篇文章主要為大家詳細介紹了JAVA實現(xiàn)感知器算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用

    Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用

    這篇文章主要介紹了Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • maven配置本地倉庫的方法步驟

    maven配置本地倉庫的方法步驟

    本文主要介紹了maven配置本地倉庫的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java實戰(zhàn)之實現(xiàn)文件資料上傳并生成縮略圖

    Java實戰(zhàn)之實現(xiàn)文件資料上傳并生成縮略圖

    這篇文章主要介紹了通過Java實現(xiàn)文件資料的上傳并生成一個縮略圖,文中的示例代碼講解詳細,對我們學習Java有一定的幫助,感興趣的小伙伴可以了解一下
    2021-12-12

最新評論