CyclicBarrier 是 Java 中一种同步机制,用于线程间的协同工作,确保线程在特定阶段同时执行。它的核心功能在于设置一个“栅栏”,只有所有线程到达该栅栏处,才能继续执行后续操作。下面详细介绍其使用方法及示例。
CyclicBarrier 提供了两个构造函数,一个用于指定线程数量,另一个用于定义所有线程到达栅栏后要执行的操作。使用时,首先创建 CyclicBarrier 对象,然后在需要等待同步的地方调用 await 方法。await 方法确保所有线程到达栅栏后返回,若等待过程中发生超时,则第一个到达的线程会抛出 TimeoutException,其他线程则会抛出 BrokenBarrierException。相关方法如下所示。
下面是一个简单的使用示例,用于演示如何使用 CyclicBarrier 实现线程同步。在 CyclicBarrierTest 类中,定义了线程数(threadNums)和 CyclicBarrier 实例(barrier)。在构造函数中创建了 CyclicBarrier 实例,并在 test 方法中创建线程。当所有线程到达栅栏时,会打印到达提示。线程启动后调用 await 方法等待,并打印当前线程到达的次序。
以启动 6 个线程为例,执行结果如下。6 个线程几乎同时启动,1 毫秒后同时到达栅栏并打印出 “All 6 threads reached barrier”,6 个线程到达的次序是 Thread-5、Thread-4、Thread-0、Thread-3、Thread-1、Thread-2。
为测试 CyclicBarrier 的其他方法,增加了 test2 方法。在不同线程启动时间间隔为 300 毫秒的情况下,创建线程时打印当前栅栏等待的线程数量,然后在 await 方法中设置等待时间为 1 秒。如果等待超时,超时的线程会打印超时提示,并通知其他线程进入 broken 状态。
理论分析下,如果按照 300 毫秒间隔创建线程,超时时间为 1 秒,则在第 4 个线程创建并等待时发生超时并通知其他线程 broken。在创建第 5 个线程时,没有线程在栅栏处等待。
以 6 个线程为例,执行结果如下。前 3 个线程启动并等待,未发生超时,一切正常。第 3 个线程启动后,时间达到 1 秒,此时第一个线程(Thread-0)超时并打印超时提示,其余线程(Thread-1、Thread-2、Thread-3)接收到 break 消息,进入 broken 状态并打印 broken 提示。随后,剩余线程(Thread-4、Thread-5)创建并启动,由于没有线程在栅栏处等待,直接进入 broken 状态并打印 broken 提示。
此内容旨在分享 Java 中 CyclicBarrier 的使用方法及示例,帮助开发者掌握线程间协同工作的技术。欲了解更多进阶知识和技术总结,可关注相关公众号或网站获取最新内容。
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。