在Java并发编程中,有时我们需要多个线程在某个点上“汇合”后再继续执行。这时,CyclicBarrier(循环屏障)就派上了大用场!本文将带你从零开始掌握Java循环屏障的使用方法,即使是编程小白也能轻松理解。
CyclicBarrier 是 Java 并发包(java.util.concurrent)中的一个同步辅助类。它允许一组线程互相等待,直到所有线程都到达某个公共屏障点(barrier point),然后一起继续执行。
与 CountDownLatch 不同的是,CyclicBarrier 是可重用的——一旦所有线程通过了屏障,它可以被重置并再次使用,因此得名“循环”屏障。
创建 CyclicBarrier 时,需要指定参与等待的线程数量。每个线程调用 await() 方法表示自己已到达屏障点。当所有线程都调用了 await(),屏障被打破,所有线程继续执行。
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierExample { public static void main(String[] args) { int numberOfThreads = 3; // 创建一个 CyclicBarrier,等待3个线程 CyclicBarrier barrier = new CyclicBarrier(numberOfThreads, () -> { System.out.println("所有线程已就位,屏障被打破!"); }); for (int i = 0; i < numberOfThreads; i++) { new Thread(() -> { try { System.out.println(Thread.currentThread().getName() + " 到达屏障..."); barrier.await(); // 等待其他线程 System.out.println(Thread.currentThread().getName() + " 继续执行!"); } catch (Exception e) { e.printStackTrace(); } }).start(); } }} 运行上述代码,你会看到类似以下输出:
Thread-0 到达屏障...Thread-2 到达屏障...Thread-1 到达屏障...所有线程已就位,屏障被打破!Thread-1 继续执行!Thread-0 继续执行!Thread-2 继续执行! 构造函数中的第二个参数是一个 Runnable 对象,称为“屏障动作”。它会在最后一个线程调用 await() 后、所有线程被释放前执行。这常用于汇总结果或日志记录。
await(long timeout, TimeUnit unit) 允许设置超时时间。如果在指定时间内未达到屏障点,会抛出 TimeoutException,此时屏障被视为已损坏(broken),其他等待的线程也会收到 BrokenBarrierException。
一旦所有线程通过屏障,CyclicBarrier 会自动重置,可以再次用于下一轮同步。这也是它与 CountDownLatch 的关键区别之一。
BrokenBarrierException。CyclicBarrier 是 Java 并发工具箱中非常实用的同步工具,特别适合需要多线程协同工作的场景。通过本教程,你应该已经掌握了 Java循环屏障 的基本用法、高级特性和最佳实践。无论是学习 Java并发工具 还是解决实际的 多线程同步 问题,CyclicBarrier 都是一个值得掌握的利器。
赶快动手试试吧!编写自己的多线程程序,体验 CyclicBarrier 带来的强大同步能力。
本文由主机测评网于2025-12-07发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124075.html