CyclicBarrier

CyclicBarrier是一个并发工具,用于让一组线程等待彼此到达屏障点后一起继续执行。它拥有指定线程数量参数,可以重置,并在屏障点执行回调任务。文章详细介绍了CyclicBarrier的概念、方法、使用示例及源码解析,包括内部Generation类、成员变量、构造函数和await()方法的工作机制。
摘要由CSDN通过智能技术生成

参考:Java并发编程的艺术

https://blog.csdn.net/qq_39241239/article/details/87030142

https://www.cnblogs.com/skywang12345/p/3533995.html#a2

JDK版本:AdoptOpenJDK 11.0.2+9

1 概念

CyclicBarrier被定义为一个屏障,当一组线程到达时被阻塞,直到最后一个线程到达时才会打开屏障,所有被屏障拦截的线程才会继续运行。

CyclicBarrier接收一个int型的参数,表示屏障拦截的线程数量。

CyclicBarrier是可复用的屏障,也可以调用reset()方法立刻重置。

CyclicBarrier还提供了一个 CyclicBarrier(int parties, Runnable barrierAction) 构造函数,其中barrierAction可用于当所有线程到达屏障时,优先执行的操作,然后再唤醒所有线程。

2 方法

CyclicBarrier提供了一些方法:

方法 说明
await() 使当前线程进入同步队列进行等待,所有的线程都到达屏障为止,可以响应中断。
await(long timeout, TimeUnit unit) 带超时时间的await()
getNumberWaiting() 返回当前正阻塞在屏障处的线程个数(实时改变)。
getParties() 返回应该要绕过这个屏障的线程个数,也就是构造函数参数中指定的阻塞线程个数。
reset() 重置。

3 例子

public class CyclicBarrierTest {
   

    public static void main(String[] args) {
   
        BarrierAction ba = new BarrierAction();
        CyclicBarrier cb = new CyclicBarrier(3, ba);

        Worker worker1 = new Worker("worker-thread-1", 1, cb);
        Worker worker2 = new Worker("worker-thread-2", 2, cb);
        Worker worker3 = new Worker("worker-thread-3", 3, cb);
        ba.setWorkers(worker1, worker2, worker3);

        worker1.start();
        worker2.start();
        worker3.start();
    }
}

/**
 * 工作线程
 */
class Worker extends Thread {
   

    private String name;
    private int n;
    private CyclicBarrier cb;

    public Worker(String name, int n, CyclicBarrier cb) {
   
        this.name = name;
        this.n = n;
        this.cb = cb;
    }

    @Override
    public void run() {
   
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值