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

Java多線程中的CyclicBarrier使用方法詳解

 更新時間:2023年12月07日 08:30:45   作者:小柴林  
這篇文章主要介紹了Java多線程中的CyclicBarrier使用方法詳解,CyclicBarrier是一種同步輔助工具,它允許一組線程都等待對方到達公共障礙點,在涉及固定大小的線程的程序中,CyclicBarriers非常有用,這些線程間必須相互等待,需要的朋友可以參考下

CyclicBarrier

特點

1、同步輔助類

2、同類相互等待(多線程間)

3、計數是加法操作

缺點

1、無法動態(tài)添加parties計數

2、調用一次await()僅占用一個parties計數

簡述與示例

一種同步輔助工具,它允許一組線程都等待對方到達公共障礙點。在涉及固定大小的線程的程序中,CyclicBarriers非常有用,這些線程間必須相互等待。

該屏障之所以稱為cyclic,是因為它可以在等待的線程被釋放之后被重用。

CyclicBarrier支持一個可選的Runnable,該命令在每個障礙點運行一次,在多線程中的最后一個線程到達之后,但在所有線程被釋放之前。

這個barrier操作對于在任何一方繼續(xù)之前更新共享狀態(tài)非常有用。

示例用法:下面是一個在并行分解設計中使用barrier的示例:

public class Solver {
    final int N;
    final float[][] data;
    final CyclicBarrier barrier;
    volatile boolean over = false;
    public Solver(float[][] matrix) throws InterruptedException {
        data = matrix;
        N = matrix.length;
        //每一輪循環(huán)都會執(zhí)行,并且需要run執(zhí)行完才會觸發(fā)下一輪開啟.
        Runnable barrierAction =
                new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Solver.run");
                        over = true;
                    }
                };
        //初始化CyclicBarrier
        barrier = new CyclicBarrier(N, barrierAction);
        List<Thread> threads = new ArrayList<>(N);
        for (int i = 0; i < N; i++) {
            Thread thread = new Thread(new Worker(i));
            threads.add(thread);
            thread.start();
        }
        // wait until done
        for (Thread thread : threads) {
            thread.join();
        }
    }
    //程序入口
    public static void main(String[] args) throws InterruptedException {
        float[][] matrix = {{1.2F}, {2.2F}};
        Solver solver = new Solver(matrix);
    }
    class Worker implements Runnable {
        int myRow;
        Worker(int row) {
            myRow = row;
        }
        @Override
        public void run() {
            while (!done()) {
                processRow(myRow);
                try {
                    barrier.await();
                } catch (InterruptedException | BrokenBarrierException ex) {
                    return;
                }
            }
        }
        private void processRow(int myRow) {
            System.out.println("Worker.processRow:" + myRow);
        }
        private boolean done() {
            return over;
        }
    }
}

在這里,每個工作線程處理矩陣中的一行,然后在barrier處等待,直到所有行都處理完畢。

處理完所有行后,將執(zhí)行提供的Runnable barrier操作并合并行。

如果合并確定找到了一個解決方案,那么done()將返回true,并且每個worker將終止。

如果barrier操作在執(zhí)行時不依賴于被掛起的參與者,那么參與者中的任何線程都可以在它被釋放時執(zhí)行該操作。

為了方便實現這一點,每次調用await都會返回barrier處該線程的到達索引。

然后您可以選擇哪個線程應該執(zhí)行barrier操作,例如:

 if (barrier.await() == 0) {
   // log the completion of this iteration
 }

CyclicBarrier使用一個動靜極限的破碎模型同步嘗試失敗:如果一個線程離開障礙點過早中斷,失敗,或超時,所有其他線程等待障礙點也將離開異常通過BrokenBarrierException(或InterruptedException如果他們也被打斷了大約在同一時間)。

內存一致性影響:在線程中調用await()之前的操作發(fā)生——在barrier操作之前發(fā)生——在其他線程中對應的await()成功返回后的操作之前。

方法介紹

構造方法

CyclicBarrier(int parties, Runnable barrierAction) 
//添加線程在屏障達到時觸發(fā)!線程會阻塞下一輪開始直到該線程執(zhí)行完畢。

普通方法

int getParties()  //獲取當前設置的屏障數
int await()       //等待直到所有線程執(zhí)行await達到屏障數
int await(long timeout, TimeUnit unit)  //等待直到所有線程執(zhí)行await達到屏障數或者超過指定超時時間
boolean isBroken()   //查詢當前屏障是否處于broken狀態(tài)
void reset()         //重置當前屏障數到初始時數量
int getNumberWaiting() //查詢當前等待未到達屏障值的線程數

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

相關文章

  • MyBatis-Plus自動化填充的踩坑記錄及解決

    MyBatis-Plus自動化填充的踩坑記錄及解決

    這篇文章主要介紹了MyBatis-Plus自動化填充的踩坑記錄及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Spring中的@ConditionalOnProperty注解詳解

    Spring中的@ConditionalOnProperty注解詳解

    這篇文章主要介紹了Spring中的@ConditionalOnProperty注解詳解,常見的@Conditionalxxx開頭的注解我們稱之為條件注解,常見的條件注解有,簡單來講,一般是在配置類上或者是@Bean修飾的方法上,添加此注解表示一個類是否要被Spring上下文加載,需要的朋友可以參考下
    2024-01-01
  • Java后端配置允許跨域方式

    Java后端配置允許跨域方式

    本文介紹了在不同技術和框架中配置跨域資源共享(CORS)的方法,包括使用SpringMVC的@CrossOrigin注解、SpringBoot的全局CORS配置、SpringSecurity中的CORS集成以及手動設置響應頭,根據具體需求和技術棧,選擇合適的方法來確保跨域請求的安全性和有效性
    2025-02-02
  • 通過一個map替換字符串中指定的字符變量方法

    通過一個map替換字符串中指定的字符變量方法

    下面小編就為大家?guī)硪黄ㄟ^一個map替換字符串中指定的字符變量方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • MyBatis中#{}?和?${}?的區(qū)別和動態(tài)?SQL詳解

    MyBatis中#{}?和?${}?的區(qū)別和動態(tài)?SQL詳解

    這篇文章主要介紹了MyBatis中#{}和${}的區(qū)別,包括參數傳遞、安全性、性能等方面,然后詳細介紹了如何使用#{}和${}進行排序、模糊查詢、動態(tài)SQL、數據庫連接池等操作,最后,總結了注解方式的動態(tài)SQL,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 淺談java二進制、十進制、十六進制、字符串之間的相互轉換

    淺談java二進制、十進制、十六進制、字符串之間的相互轉換

    下面小編就為大家?guī)硪黄獪\談二進制、十進制、十六進制、字符串之間的相互轉換。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-06-06
  • IntelliJ IDEA遠程Debug Linux的Java程序,找問題不要只會看日志了(推薦)

    IntelliJ IDEA遠程Debug Linux的Java程序,找問題不要只會看日志了(推薦)

    這篇文章主要介紹了IntelliJ IDEA遠程Debug Linux的Java程序,找問題不要只會看日志了,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 詳解Spring Boot使用系統(tǒng)參數表提升系統(tǒng)的靈活性

    詳解Spring Boot使用系統(tǒng)參數表提升系統(tǒng)的靈活性

    Spring Boot項目中常有一些相對穩(wěn)定的參數設置項,其作用范圍是系統(tǒng)級的或模塊級的,這些參數稱為系統(tǒng)參數。這些變量以參數形式進行配置,從而提高變動和擴展的靈活性,保持代碼的穩(wěn)定性
    2021-06-06
  • Spring Boot面試題總結

    Spring Boot面試題總結

    這篇文章主要介紹了Spring Boot面試題總結,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • Java設計模式之23種設計模式詳解

    Java設計模式之23種設計模式詳解

    這篇文章主要介紹了Java設計模式之23種設計模式詳解,設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,項目中合理的運用設計模式可以完美的解決很多問題,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07

最新評論