cyclicBarrier 循环屏障
是Java并发编程中的一种同步工具,它允许一组线程在达到某个共同点之前相互等待。CyclicBarrier可以用于将多个线程分阶段地执行,并在每个阶段结束时进行同步。
CyclicBarrier
的工作原理是通过一个可重用的屏障来实现的。在创建CyclicBarrier
时,需要指定参与线程的数量。每个线程在到达屏障点之前调用await()
方法进行等待,当所有线程都到达屏障点时,它们被释放,可以继续执行后续操作。
API说明:
await()
: 线程等待并到达屏障点。如果线程是最后一个到达的线程,它将触发屏障动作,唤醒所有等待的线程。getParties()
: 返回参与线程的数量。reset()
: 重置屏障,将计数值重置为初始值,并且使等待的线程被释放。CyclicBarrier(int parties, Runnable barrierAction)
: 构造方法传入parties, 和一个屏障动作任务, 每当工作线程调用一次await方法, parties的值减1, 直到0为止, 唤醒工作线程, 唤醒所有工作线程后立即执行barrierAction任务.
案例
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.logging.Logger;
public class CyclicBarrierTest {
static Logger log = Logger.getLogger("zzzzzzzzz");
public static void main(String[] args) {
CyclicBarrier cb = new CyclicBarrier(2, () -> {
log.info("2个线程到达屏障点后运行屏障动作");
});
for (int i = 0; i < 1; i++) {
new Thread(() -> {
log.info("线程1运行----开始");
try {
Thread.sleep(1000);
// 进入等待屏障
cb.await();
log.info("线程1运行----结束");
} catch (InterruptedException | BrokenBarrierException e) {
throw new RuntimeException(e);
}
}).start();
new Thread(() -> {
log.info("线程2运行----开始");
try {
Thread.sleep(2000);
cb.await();
log.info("线程2运行----结束");
} catch (InterruptedException | BrokenBarrierException e) {
throw new RuntimeException(e);
}
}).start();
}
}
}
/**
-----------------当循环次数为1时运行结果----------------
-- 可以看到, 两个线程2秒后被同步唤醒, 同时执行了barrier任务
七月 04, 2023 11:03:22 下午
信息: 线程2运行----开始
七月 04, 2023 11:03:22 下午
信息: 线程1运行----开始
七月 04, 2023 11:03:24 下午
信息: 2个线程到达屏障点后运行屏障动作
七月 04, 2023 11:03:24 下午
信息: 线程2运行----结束
七月 04, 2023 11:03:24 下午
信息: 线程1运行----结束
-----------------当循环次数为2时运行结果----------------
-- 可以看到, 每两个线程到达屏障点, 就执行barrier任务,共执行2次
七月 04, 2023 11:06:26 下午
信息: 线程1运行----开始
七月 04, 2023 11:06:26 下午
信息: 线程2运行----开始
七月 04, 2023 11:06:26 下午
信息: 线程2运行----开始
七月 04, 2023 11:06:26 下午
信息: 线程1运行----开始
七月 04, 2023 11:06:27 下午
信息: 2个线程到达屏障点后运行屏障动作
七月 04, 2023 11:06:27 下午
信息: 线程1运行----结束
七月 04, 2023 11:06:27 下午
信息: 线程1运行----结束
七月 04, 2023 11:06:28 下午
信息: 2个线程到达屏障点后运行屏障动作
七月 04, 2023 11:06:28 下午
信息: 线程2运行----结束
七月 04, 2023 11:06:28 下午
信息: 线程2运行----结束
**/