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

Java中的CyclicBarrier循環(huán)柵欄解析

 更新時間:2023年12月31日 08:07:33   作者:_Romeo  
這篇文章主要介紹了Java中的CyclicBarrier循環(huán)柵欄解析,從字面上的意思可以知道,這個類的中文意思是"循環(huán)柵欄",大概的意思就是一個可循環(huán)利用的屏障,它的作用就是會讓所有線程都等待完成后才會繼續(xù)下一步行動,需要的朋友可以參考下

概念

  • 從字面上的意思可以知道,這個類的中文意思是“循環(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)文章

最新評論