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/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
  • 北化教务管理系统介绍及开发代码示例

    本文将从多个方面对北化教务管理系统进行介绍及开发代码示例,帮助开发者更好地理解和应用该系统。 一、项目介绍 北化教务管理系统是一款针对高校学生和教职工的综合信息管理系统。系统实现的…

    编程 2025-04-29
  • 服务器安装Python的完整指南

    本文将为您提供服务器安装Python的完整指南。无论您是一位新手还是经验丰富的开发者,您都可以通过本文轻松地完成Python的安装过程。以下是本文的具体内容: 一、下载Python…

    编程 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

发表回复

登录后才能评论