CyclicBarrier 实现阶段性同步

本文详细介绍了CyclicBarrier的特性,包括其阶段性同步、阻塞等待和与CountDownLatch的区别。CyclicBarrier允许线程在达到预设数量时一起执行,支持多次循环,而CountDownLatch仅支持单次。此外,文章还讲解了CyclicBarrier的常用方法,如阻塞等待、查询线程到达情况以及如何处理阻塞节点的异常和中断。最后,通过一个10名运动员两两比赛的案例展示了CyclicBarrier的实际应用场景。
摘要由CSDN通过智能技术生成

01 CyclicBarrier

在这里插入图片描述

CyclicBarrier 提供了如下功能:

(1)向上增加计数的功能

(2)阻塞等待功能

(3)阶段性同步功能(线程数大于 parties 数量时)

(4)支持多次循环实现多个线程一起执行的目的。


02 与 CountDownLatch 的比较

(1)CountDownLatch 时计数器做减法,而 CyclicBarrier 时通过累加来实现。

(2)CountDownLatch 只支持单次多个线程阻塞然后一起执行,CyclicBarrier 是支持多次的。


03 常用方法

await() 阻塞等待,直到达到构造函数中指定的数量之后继续向下执行。

getNumberWaiting() 获取有几个线程已到了阻塞节点

isBroken() 查询阻塞是否受到损坏,这里的损坏指的是当出现异常后 阻塞节点是否还能够正常工作。

例如: 5 个线程线程阻塞时有一个线程抛出了 NullPointException,那么只有抛出 NullPointException 的线程停止运行,其他 4 个线程依然在运行。

再比如:5 个线程中有一个线程执行了 interruput() 中断,那么其他几个阻塞等待的线程都会停止运行。阻塞节点被破坏。

getParties() 获取构造函数中指定的 parties 数

reset() 重置阻塞。


04 案例

10 个运动员(Runner)参加淘汰赛,两两一组比赛。

Runner.java

package com.page.concurrent.cyclicbarrier;

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

public class Runner extends Thread {
    private final CyclicBarrier cyclicBarrier;
    private final int number;

    public Runner(CyclicBarrier cyclicBarrier, int number) {
        this.cyclicBarrier = cyclicBarrier;
        this.number = number;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()
                + ":"
                + System.currentTimeMillis()
                + " Ready. Waiting another one.");


        try {
            Thread.sleep(1000 * number);
            cyclicBarrier.await();

            System.out.println(Thread.currentThread().getName() + " run.");
        } catch (InterruptedException e) {
            System.out.println("had exception when waiting others. e=" + e.getMessage());
        } catch (BrokenBarrierException e) {
            System.out.println("had exception when waiting others. e" + e.getMessage());
        }


    }
}

Game.java

package com.page.concurrent.cyclicbarrier;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CyclicBarrier;

public class Game {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(2,
                () -> System.out.println(System.currentTimeMillis() + ">>>> 2 runner had ready."));
        List<Runner> runners = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            Runner runner = new Runner(cyclicBarrier, i);
            runner.start();
            runners.add(runner);
        }


    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值