Java中的CyclicBarrier循環(huán)柵欄解析
概念
- 從字面上的意思可以知道,這個類的中文意思是“循環(huán)柵欄”。大概的意思就是一個可循環(huán)利用的屏障。
- 它的作用就是會讓所有線程都等待完成后才會繼續(xù)下一步行動。
- 舉個例子,就像生活中我們會約朋友們到某個餐廳一起吃飯,有些朋友可能會早到,有些朋友可能會晚到,但是這個餐廳規(guī)定必須等到所有人到齊之后才會讓我們進去。這里的朋友們就是各個線程,餐廳就是 CyclicBarrier。
構(gòu)造方法
public CyclicBarrier(int parties) public CyclicBarrier(int parties, Runnable barrierAction)
解析:
- parties 是參與線程的個數(shù)
- 第二個構(gòu)造方法有一個 Runnable 參數(shù),這個參數(shù)的意思是最后一個到達線程要做的任務(wù)
重要方法
public int await() throws InterruptedException, BrokenBarrierException public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
解析:
- 線程調(diào)用 await() 表示自己已經(jīng)到達柵欄
- BrokenBarrierException 表示柵欄已經(jīng)被破壞,破壞的原因可能是其中一個線程 await() 時被中斷或者超時
自定義實現(xiàn)一個CyclicBarrier
代碼如下:
public class KaneCyclicBarrier { private final ReentrantLock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); private int count =0; //批次 private final int parties; //多少線程準備就緒? private Object generation = new Object(); public KaneCyclicBarrier(int parties) { this.parties = parties; } public void await(){ final ReentrantLock lock = this.lock; lock.lock(); try { final Object g = generation; int index = ++count; if (index == parties) { nextGeneration(); return; } while (true) { try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } if(g!=generation){ return; } } }finally { lock.unlock(); } } public void nextGeneration(){ condition.signalAll(); count=0; generation = new Object(); } }
測試一下,代碼如下:
public class CyclicBarrier_Demo { public CyclicBarrier_Demo() { } public static void main(String[] args) throws InterruptedException { KaneCyclicBarrier barrier = new KaneCyclicBarrier(4); for(int i = 0; i < 100; ++i) {//假設(shè)有100個任務(wù),每次只能有固定數(shù)量的線程去執(zhí)行,可以使用這個 (new Thread(() -> { barrier.await(); System.out.println("任務(wù)開始執(zhí)行"); })).start(); Thread.sleep(500L); } } }
CyclicBarrier 可以用于多線程計算數(shù)據(jù),最后合并計算結(jié)果的場景。
CyclicBarrier 與 CountDownLatch 區(qū)別
- CountDownLatch 是一次性的,CyclicBarrier 是可循環(huán)利用的
- CountDownLatch減計數(shù),CyclicBarrier加計數(shù)。
- CountDownLatch 參與的線程的職責是不一樣的,有的在倒計時,有的在等待倒計時結(jié)束。CyclicBarrier 參與的線程職責是一樣的。
到此這篇關(guān)于Java中的CyclicBarrier循環(huán)柵欄解析的文章就介紹到這了,更多相關(guān)CyclicBarrier循環(huán)柵欄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解SpringBoot中5種類型參數(shù)傳遞和json數(shù)據(jù)傳參的操作
當涉及到參數(shù)傳遞時,Spring?Boot遵循HTTP協(xié)議,并支持多種參數(shù)傳遞方式,這些參數(shù)傳遞方式可以根據(jù)請求的不同部分進行分類,2023-12-12Java Scanner對象中hasNext()與next()方法的使用
這篇文章主要介紹了Java Scanner對象中hasNext()與next()方法的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Java DecimalFormat 保留小數(shù)位及四舍五入的陷阱介紹
這篇文章主要介紹了Java DecimalFormat 保留小數(shù)位及四舍五入的陷阱,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Java數(shù)字轉(zhuǎn)中文大寫工具類詳細代碼(拿去即用)
最近項目中用到金額轉(zhuǎn)大寫的地方,索性給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Java數(shù)字轉(zhuǎn)中文大寫工具類的相關(guān)資料,文中給出了詳細的代碼示例,需要的朋友可以參考下2024-05-05java String、Json對象與byte數(shù)組轉(zhuǎn)換方式
這篇文章主要介紹了java String、Json對象與byte數(shù)組轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07