CyclicBarrier實現多線程任務同步的完整示例

一、CyclicBarrier簡介

CyclicBarrier是Java並發包中的一個實用工具, 它可以用於多線程間的同步。它讓一組線程在某個節點處等待,直到所有線程都到達該節點,然後再一起繼續執行後續任務。

CyclicBarrier可以用於以下場景:

  • 分階段執行任務:將任務分為若干個階段,在每個階段結束後等待所有線程到達這個節點,然後再開始後續的階段。
  • 分治計算:將大規模的計算任務分解為若干小的計算任務,在每個小任務完成後等待其他小任務完成,最終再合併結果。

二、CyclicBarrier的用法

1. 創建CyclicBarrier對象

CyclicBarrier cyclicBarrier = new CyclicBarrier(int parties, Runnable action);

其中parties是需要等待的線程數,action是在所有線程都到達屏障時需要執行的任務。CyclicBarrier還有一個重載方法,不需要指定Runnable任務。

CyclicBarrier cyclicBarrier = new CyclicBarrier(int parties);

2. 等待線程到達屏障點

cyclicBarrier.await();

調用await方法的線程會在此處等待,知道全部線程到達該屏障點,才會一起繼續執行。

3. CyclicBarrier的reset方法

cyclicBarrier.reset();

reset方法可以使CyclicBarrier的狀態恢復到初始化狀態,方便在重複使用CyclicBarrier時調用。

三、完整代碼示例

1. 在主線程中啟動多個其他線程,等待所有線程完成後,主線程再繼續執行

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {

    private static final int THREADS = 5;

    public static void main(String[] args) {
        Runnable barrierAction = new Runnable() {
            public void run() {
                System.out.println("All threads have arrived at the barrier.");
            }
        };
        CyclicBarrier barrier = new CyclicBarrier(THREADS, barrierAction);

        for (int i = 0; i < THREADS; i++) {
            Thread thread = new Thread(new Worker(barrier), "Thread " + i);
            thread.start();
        }

        System.out.println("Main thread continues to do its work.");
    }

    static class Worker implements Runnable {
        private final CyclicBarrier cyclicBarrier;

        public Worker(CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
        }

        public void run() {
            try {
                System.out.println("Thread " + Thread.currentThread().getName() + " is doing some work.");
                Thread.sleep(1000);
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

2. 多個線程分別執行不同任務,等待所有任務執行完成後再繼續

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {

    private static final int THREADS = 5;

    public static void main(String[] args) {
        Runnable barrierAction = new Runnable() {
            public void run() {
                System.out.println("All threads have arrived at the barrier.");
            }
        };
        CyclicBarrier barrier = new CyclicBarrier(THREADS, barrierAction);

        for (int i = 0; i < THREADS; i++) {
            Thread thread = new Thread(new Worker(barrier, i), "Thread " + i);
            thread.start();
        }

        System.out.println("Main thread continues to do its work.");
    }

    static class Worker implements Runnable {
        private final CyclicBarrier cyclicBarrier;
        private final int workId;

        public Worker(CyclicBarrier cyclicBarrier, int workId) {
            this.cyclicBarrier = cyclicBarrier;
            this.workId = workId;
        }

        public void run() {
            try {
                System.out.println("Thread " + Thread.currentThread().getName() + " is doing work " + workId);
                Thread.sleep((workId + 1) * 1000);
                cyclicBarrier.await();
                System.out.println("Thread " + Thread.currentThread().getName() + " continues to do its work after barrier.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

參考資料

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/284933.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 15:42
下一篇 2024-12-22 15:42

相關推薦

  • 如何在Java中拼接OBJ格式的文件並生成完整的圖像

    OBJ格式是一種用於表示3D對象的標準格式,通常由一組頂點、面和紋理映射坐標組成。在本文中,我們將討論如何將多個OBJ文件拼接在一起,生成一個完整的3D模型。 一、讀取OBJ文件 …

    編程 2025-04-29
  • 打造照片漫畫生成器的完整指南

    本文將分享如何使用Python編寫一個簡單的照片漫畫生成器,本文所提到的所有代碼和技術都適用於初學者。 一、環境準備 在開始編寫代碼之前,我們需要準備一些必要的環境。 首先,需要安…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Python中文版下載官網的完整指南

    Python是一種廣泛使用的編程語言,具有簡潔、易讀易寫等特點。Python中文版下載官網是Python學習和使用過程中的重要資源,本文將從多個方面對Python中文版下載官網進行…

    編程 2025-04-29
  • 服務器安裝Python的完整指南

    本文將為您提供服務器安裝Python的完整指南。無論您是一位新手還是經驗豐富的開發者,您都可以通過本文輕鬆地完成Python的安裝過程。以下是本文的具體內容: 一、下載Python…

    編程 2025-04-29
  • 北化教務管理系統介紹及開發代碼示例

    本文將從多個方面對北化教務管理系統進行介紹及開發代碼示例,幫助開發者更好地理解和應用該系統。 一、項目介紹 北化教務管理系統是一款針對高校學生和教職工的綜合信息管理系統。系統實現的…

    編程 2025-04-29
  • 微信小程序和Python數據交互完整指南

    本篇文章將從多個方面介紹如何在微信小程序中實現與Python的數據交互。通過本文的學習,您將掌握如何將微信小程序與後台Python代碼結合起來,實現更豐富的功能。 一、概述 微信小…

    編程 2025-04-29
  • 使用Snare服務收集日誌:完整教程

    本教程將介紹如何使用Snare服務收集Windows服務器上的日誌,並將其發送到遠程服務器進行集中管理。 一、安裝和配置Snare 1、下載Snare安裝程序並安裝。 https:…

    編程 2025-04-29
  • Saturn 定時任務用法介紹

    本文將從以下幾個方面對Saturn定時任務進行詳細的闡述: 一、Saturn 定時任務簡介 Saturn是一個分佈式任務調度系統,支持在線添加、修改定時任務,支持多種任務類型,如J…

    編程 2025-04-29

發表回復

登錄後才能評論