亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
一、簡(jiǎn)介
二、CyclicBarrier的使用
CyclicBarrier 應(yīng)用場(chǎng)景
首頁(yè) Java java教程 Java中CyclicBarrier循環(huán)屏障怎麼應(yīng)用

Java中CyclicBarrier循環(huán)屏障怎麼應(yīng)用

May 12, 2023 pm 02:19 PM
java cyclicbarrier

一、簡(jiǎn)介

CyclicBarrier 字面意思回環(huán)柵欄(循環(huán)屏障),它可以實(shí)現(xiàn)讓一組執(zhí)行緒等待至某個(gè)狀態(tài)(屏障點(diǎn))之後再全部同時(shí)執(zhí)行。叫做回環(huán)是因?yàn)楫?dāng)所有等待線程都被釋放以後,CyclicBarrier可以被重複使用。?

Java中CyclicBarrier循環(huán)屏障怎麼應(yīng)用

CyclicBarrier 作用是讓一組執(zhí)行緒互相等待,當(dāng)達(dá)到一個(gè)共同點(diǎn)時(shí),所有先前等待的執(zhí)行緒再繼續(xù)執(zhí)行,且 CyclicBarrier 功能可重複使用。

二、CyclicBarrier的使用

#建構(gòu)方法:

 // parties表示屏障攔截的線程數(shù)量,每個(gè)線程調(diào)用 await 方法告訴 CyclicBarrier 我已經(jīng)到達(dá)了屏障,然后當(dāng)前線程被阻塞。
 public CyclicBarrier(int parties)
 // 用于在線程到達(dá)屏障時(shí),優(yōu)先執(zhí)行 barrierAction,方便處理更復(fù)雜的業(yè)務(wù)場(chǎng)景(該線程的執(zhí)行時(shí)機(jī)是在到達(dá)屏障之后再執(zhí)行)

重要方法:

//屏障 指定數(shù)量的線程全部調(diào)用await()方法時(shí),這些線程不再阻塞
// BrokenBarrierException 表示柵欄已經(jīng)被破壞,破壞的原因可能是其中一個(gè)線程 await() 時(shí)被中斷或者超時(shí)
public int await() throws InterruptedException, BrokenBarrierException
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
//循環(huán)  通過(guò)reset()方法可以進(jìn)行重置

CyclicBarrier 應(yīng)用場(chǎng)景

  • 利用CyclicBarrier 可以用於多執(zhí)行緒計(jì)算數(shù)據(jù),最後合併計(jì)算結(jié)果的場(chǎng)景。

  • 利用CyclicBarrier的計(jì)數(shù)器能夠重置,屏障可以重複使用的特性,可以支援類(lèi)似「人滿發(fā)車(chē)」的場(chǎng)景

##模擬合併計(jì)算場(chǎng)景

利用CyclicBarrier 可以用於多執(zhí)行緒計(jì)算數(shù)據(jù),最後合併計(jì)算結(jié)果的場(chǎng)景。

public class CyclicBarrierTest2 {
    //保存每個(gè)學(xué)生的平均成績(jī)
    private Conc urrentHashMap<String, Integer> map=new ConcurrentHashMap<String,Integer>();
    private ExecutorService threadPool= Executors.newFixedThreadPool(3);
    private CyclicBarrier cb=new CyclicBarrier(3,()->{
        int result=0;
        Set<String> set = map.keySet();
        for(String s:set){
            result+=map.get(s);
        }
        System.out.println("三人平均成績(jī)?yōu)?"+(result/3)+"分");
    });
    public void count(){
        for(int i=0;i<3;i++){
            threadPool.execute(new Runnable(){

                @Override
                public void run() {
                    //獲取學(xué)生平均成績(jī)
                    int score=(int)(Math.random()*40+60);
                    map.put(Thread.currentThread().getName(), score);
                    System.out.println(Thread.currentThread().getName()
                            +"同學(xué)的平均成績(jī)?yōu)椋?quot;+score);
                    try {
                        //執(zhí)行完運(yùn)行await(),等待所有學(xué)生平均成績(jī)都計(jì)算完畢
                        cb.await();
                    } catch (InterruptedException | BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }

            });
        }
    }
    public static void main(String[] args) {
        CyclicBarrierTest2 cb=new CyclicBarrierTest2();
        cb.count();
    }
}

模擬「人滿發(fā)車(chē)」的場(chǎng)景

利用CyclicBarrier的計(jì)數(shù)器能夠重置,屏障可以重複使用的特性,可以支援類(lèi)似「人滿發(fā)車(chē)」的場(chǎng)景

public class CyclicBarrierTest3 {
    public static void main(String[] args) {
        AtomicInteger counter = new AtomicInteger();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5, 5, 1000, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(100),
                (r) -> new Thread(r, counter.addAndGet(1) + " 號(hào) "),
                new ThreadPoolExecutor.AbortPolicy());

        CyclicBarrier cyclicBarrier = new CyclicBarrier(5,
                () -> System.out.println("裁判:比賽開(kāi)始~~"));

        for (int i = 0; i < 10; i++) {
            threadPoolExecutor.submit(new Runner(cyclicBarrier));
        }

    }
    static class Runner extends Thread{
        private CyclicBarrier cyclicBarrier;
        public Runner (CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
        }
        @Override
        public void run() {
            try {
                int sleepMills = ThreadLocalRandom.current().nextInt(1000);
                Thread.sleep(sleepMills);
                System.out.println(Thread.currentThread().getName() + " 選手已就位, 準(zhǔn)備共用時(shí): " + sleepMills + "ms" + cyclicBarrier.getNumberWaiting());
                cyclicBarrier.await();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }catch(BrokenBarrierException e){
                e.printStackTrace();
            }
        }
    }

}

輸出結(jié)果:

3 號(hào)?選手已就位, 準(zhǔn)備共用時(shí): 78ms0

1 號(hào)?選手已就位, 準(zhǔn)備共用時(shí): 395ms1
5 號(hào)?選手已就位, 準(zhǔn)備共用時(shí): 733ms2
2 號(hào)?選手已就位, 準(zhǔn)備共用時(shí): 776ms3
4 號(hào)?選手已就位, 準(zhǔn)備共用時(shí): 807ms4
裁判:比賽開(kāi)始~~
4 號(hào)?選手已就位, 準(zhǔn)備共用時(shí): 131ms0
3 號(hào)?選手已就位, 準(zhǔn)備共用時(shí): 256ms1
2 號(hào)?選手已就位, 準(zhǔn)備共用時(shí): 291ms2
# 1 號(hào)?選手已就位, 準(zhǔn)備共用時(shí): 588ms3
5 號(hào)?選手已就位, 準(zhǔn)備共用時(shí): 763ms4
裁判:比賽開(kāi)始~~

#三、CyclicBarrier 原始碼分析

CyclicBarrier 流程??

主要是的流程:

  • 取得鎖定如果count != 0 就進(jìn)入阻塞;

  • 進(jìn)入阻塞之前,首先需要進(jìn)入條件佇列,然後釋放鎖,最後阻塞;

  • 如果count != 0 會(huì)進(jìn)行一個(gè)喚醒,將所有的條件佇列中的節(jié)點(diǎn)轉(zhuǎn)換為阻塞佇列;

  • 被喚醒後會(huì)進(jìn)行鎖定的獲取,如果鎖定獲取失敗,會(huì)進(jìn)入lock 的阻塞佇列;

  • 如果鎖定取得成功,進(jìn)行鎖定的釋放,以及喚醒,同步佇列中的執(zhí)行緒。

下面是一個(gè)簡(jiǎn)單的流程圖:

Java中CyclicBarrier循環(huán)屏障怎麼應(yīng)用

下面是一些具體的程式碼呼叫的流程:

Java中CyclicBarrier循環(huán)屏障怎麼應(yīng)用

幾個(gè)常見(jiàn)的問(wèn)題?

  • 1.一組執(zhí)行緒在觸發(fā)屏障之前互相等待,最後一個(gè)執(zhí)行緒到達(dá)屏障後喚醒邏輯是如何實(shí)現(xiàn)的. 喚醒的過(guò)程是透過(guò)呼叫?

    java.util. concurrent.locks.Condition#signalAll喚醒條件佇列上的所有節(jié)點(diǎn)。

  • 2.刪欄循環(huán)使用如何實(shí)現(xiàn)的? 實(shí)際上一個(gè)互斥鎖 ReentrantLock 的條件佇列和阻塞佇列的轉(zhuǎn)換。

  • 3.條件佇列到同步佇列的轉(zhuǎn)換實(shí)作邏輯? 轉(zhuǎn)換過(guò)程中,首先會(huì)先將條件佇列中所有的阻塞執(zhí)行緒喚醒,然後會(huì)去取得lock 如果取得失敗,就進(jìn)入同步隊(duì)列。

CyclicBarrier 與 CountDownLatch的差異

  • CountDownLatch的計(jì)數(shù)器只能使用一次,而CyclicBarrier的計(jì)數(shù)器可以使用reset() 方法重設(shè)。所以CyclicBarrier能處理更複雜的業(yè)務(wù)場(chǎng)景,例如如果計(jì)算發(fā)生錯(cuò)誤,可以重置計(jì)數(shù)器,並讓線程們重新執(zhí)行一次

  • CyclicBarrier還提供getNumberWaiting(可以獲得CyclicBarrier阻塞的執(zhí)行緒數(shù)量)、isBroken(用來(lái)知道阻塞的執(zhí)行緒是否被中斷)等方法。

  • CountDownLatch會(huì)阻塞主線程,CyclicBarrier不會(huì)阻塞主線程,只會(huì)阻塞子執(zhí)行緒。

  • CountDownLatch和CyclicBarrier都能夠?qū)崿F(xiàn)執(zhí)行緒之間的等待,只不過(guò)它們重點(diǎn)不同。 CountDownLatch一般用於一個(gè)或多個(gè)線程,等待其他執(zhí)行緒執(zhí)行完任務(wù)後,再執(zhí)行。 CyclicBarrier一般用於一組執(zhí)行緒互相等待至某個(gè)狀態(tài),然後這一組執(zhí)行緒再同時(shí)執(zhí)行。

  • CyclicBarrier 也可以提供一個(gè) barrierAction,合併多執(zhí)行緒計(jì)算結(jié)果。

  • CyclicBarrier是透過(guò)ReentrantLock的"獨(dú)佔(zhàn)鎖定"和Conditon來(lái)實(shí)現(xiàn)一組執(zhí)行緒的阻塞喚醒的,而CountDownLatch則是透過(guò)AQS的「共享鎖定」實(shí)作

#

以上是Java中CyclicBarrier循環(huán)屏障怎麼應(yīng)用的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級(jí)或工作區(qū)級(jí)路徑,用於自定義VSCode設(shè)置。 1.用戶級(jí)路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級(jí)路徑:項(xiàng)目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開(kāi)始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類(lèi)替代舊的Date和Calendar類(lèi);2.通過(guò)LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過(guò)DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過(guò)Instant與舊日期類(lèi)型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

Google Chrome無(wú)法打開(kāi)本地文件 Google Chrome無(wú)法打開(kāi)本地文件 Aug 01, 2025 am 05:24 AM

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

了解網(wǎng)絡(luò)端口和防火牆 了解網(wǎng)絡(luò)端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

See all articles