亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

使用場(chǎng)景

想象一個(gè)這樣的場(chǎng)景,我們?cè)诖蛲跽邩s耀/英雄聯(lián)盟的時(shí)候,都會(huì)有一個(gè)匹配機(jī)制,需要10個(gè)人都加載完成后,大家才能一起進(jìn)入游戲,不然會(huì)出現(xiàn)大家進(jìn)入游戲的時(shí)間不一致的情況,這個(gè)時(shí)候就可以使用CyclicBarrier來(lái)實(shí)現(xiàn)。

基本原理

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

常用方法

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

使用示例

定義玩家運(yùn)行程序

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 + "號(hào)正在加載游戲...");
        try {
            TimeUnit.SECONDS.sleep(2);
            cyclicBarrier.await();
        } catch (Exception e) {
            System.out.println("線程執(zhí)行出現(xiàn)問(wèn)題");
        }
        System.out.println("玩家" + number + "號(hào)加載完成。");
    }
}

定義主程序

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í)等待的線程數(shù)
        System.out.println("此時(shí)等待的線程數(shù)為:" + cyclicBarrier.getNumberWaiting());
        for (int i = 0; i < 10; i++){
            CyclicBarrierRunnable runnable = new CyclicBarrierRunnable(cyclicBarrier, i);
            new Thread(runnable).start();
        }
    }
}

運(yùn)行結(jié)果

執(zhí)行說(shuō)明

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

內(nèi)部原理

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

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

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

注意事項(xiàng)

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

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

相關(guān)文章

  • java中的自增問(wèn)題介紹

    java中的自增問(wèn)題介紹

    下面小編就為大家?guī)?lái)一篇java中的自增問(wèn)題介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家。給大家一個(gè)參考。
    2016-03-03
  • IDEA導(dǎo)出jar打包成exe應(yīng)用程序的小結(jié)

    IDEA導(dǎo)出jar打包成exe應(yīng)用程序的小結(jié)

    這篇文章主要介紹了IDEA導(dǎo)出jar打包成exe應(yīng)用程序,需要的朋友可以參考下
    2020-08-08
  • Spring-Security對(duì)HTTP相應(yīng)頭的安全支持方式

    Spring-Security對(duì)HTTP相應(yīng)頭的安全支持方式

    這篇文章主要介紹了Spring-Security對(duì)HTTP相應(yīng)頭的安全支持方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • SpringMVC實(shí)現(xiàn)獲取請(qǐng)求參數(shù)方法詳解

    SpringMVC實(shí)現(xiàn)獲取請(qǐng)求參數(shù)方法詳解

    Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開(kāi)發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì),這篇文章主要介紹了SpringMVC實(shí)現(xiàn)獲取請(qǐng)求參數(shù)方法
    2022-09-09
  • Java背包問(wèn)題求解實(shí)例代碼

    Java背包問(wèn)題求解實(shí)例代碼

    這篇文章主要介紹了Java背包問(wèn)題求解實(shí)例代碼,其中涉及兩種背包:01和完全背包。分別講述了兩種背包的思路和實(shí)現(xiàn)方法,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • java實(shí)現(xiàn)簡(jiǎn)單的推箱子小游戲

    java實(shí)現(xiàn)簡(jiǎn)單的推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Intellij IDEA 最全超實(shí)用快捷鍵整理(長(zhǎng)期更新)

    Intellij IDEA 最全超實(shí)用快捷鍵整理(長(zhǎng)期更新)

    這篇文章主要介紹了Intellij IDEA 最全實(shí)用快捷鍵整理(長(zhǎng)期更新),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 利用Spring AOP記錄方法的執(zhí)行時(shí)間

    利用Spring AOP記錄方法的執(zhí)行時(shí)間

    這篇文章給大家介紹的是spring的aop來(lái)實(shí)現(xiàn)方法級(jí)的執(zhí)行時(shí)間的記錄監(jiān)控,以此來(lái)評(píng)估方法的性能以及針對(duì)性的對(duì)已存在的方法進(jìn)行優(yōu)化。對(duì)于監(jiān)控,我們比較關(guān)注監(jiān)控的可靠性和性能,準(zhǔn)確,高效,這才能在不影響整體性能的情況下對(duì)我們的系統(tǒng)性能有個(gè)較準(zhǔn)確的認(rèn)識(shí)。
    2016-09-09
  • Java查找并高亮PDF文本過(guò)程解析

    Java查找并高亮PDF文本過(guò)程解析

    這篇文章主要介紹了Java查找并高亮PDF文本過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • springboot中的@value取不到正確的值問(wèn)題

    springboot中的@value取不到正確的值問(wèn)題

    這篇文章主要介紹了springboot中的@value取不到正確的值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論