Java并发编程CyclicBarrier栅栏原理与使用实例

小满
小满
发布时间:2026-10-14| 6人浏览过
原创

在Java多线程开发中,除了CountDownLatch,CyclicBarrier同样是重要的同步工具。本文解析CyclicBarrier的原理,并通过代码实例展示如何实现多个线程相互等待后共同执行后续逻辑。

CyclicBarrier与闭锁的区别

CyclicBarrier(栅栏)与CountDownLatch(闭锁)虽然都用于控制线程执行顺序,但核心逻辑不同:

  • 闭锁(CountDownLatch):强调一个或多个事件的发生。通常由主线程等待特定数量的countDown事件完成,一旦计数器归零,所有等待的线程即可继续执行。
  • 栅栏(CyclicBarrier):强调多个线程之间的相互等待。它指定了需要参与同步的线程数量(N个),只有当所有N个线程都调用await()方法到达屏障点时,才会同时释放,允许所有线程继续执行。此外,CyclicBarrier支持设置barrierAction(屏障动作),在所有线程到达后执行一段 Runnable 任务。

应用场景分析

最典型的应用场景是“多点集合”或“协同作业”。例如:10名队员去春游,规定必须在指定地点全部到齐后,才能统一出发前往下一景点。如果某人迟到,所有人都必须等待。

第1步:定义工作线程与资源

创建一个实现Runnable接口的Worker类,内部持有CyclicBarrier引用。在线程执行过程中,调用barrier.await()挂起自身,等待其他同伴。

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

class CyclicBarrierWorker implements Runnable {
    private int id;
    private CyclicBarrier barrier;

    public CyclicBarrierWorker(int id, final CyclicBarrier barrier) {
        this.id = id;
        this.barrier = barrier;
    }

    @Override
    public void run() {
        try {
            System.out.println(id + " th people wait");
            // 等待其他线程到达
            barrier.await(); 
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

第2步:初始化栅栏并启动线程

在main方法中创建CyclicBarrier实例,参数包括parties(参与者数量)和barrierAction(可选,当所有线程到达时执行的回调任务)。随后启动多个线程模拟人员集合。

public class TestCyclicBarrier {
    public static void main(String[] args) {
        int num = 10;
        // 初始化栅栏,10人到达后执行回调
        CyclicBarrier barrier = new CyclicBarrier(num, new Runnable() {
            @Override
            public void run() {
                System.out.println("go on together!");
            }
        });

        // 启动10个线程
        for (int i = 1; i <= num; i++) {
            new Thread(new CyclicBarrierWorker(i, barrier)).start();
        }
    }
}

运行结果与结论

程序输出显示,前10行依次打印了各线程的等待状态。由于栅栏机制要求全员到齐,直到最后一个线程(第10人)调用await()触发屏障,此时才会执行回调任务,输出最后一行结果。

1 th people wait
2 th people wait
...
10 th people wait
go on together!

通过CyclicBarrier,我们可以轻松构建需要多线程度数一致后再统一行动的并发模型。以上就是Java并发编程之CyclicBarrier栅栏实例介绍的详细内容,更多关于Java并发编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。