Java的CountDownLatch和CyclicBarrier的理解和区别

本文介绍了Java并发工具CountDownLatch和CyclicBarrier的区别和使用方法。CountDownLatch在计数到0时由主线程触发后续操作,适合一次性事件;CyclicBarrier则允许线程自身触发下一轮操作,适用于多轮迭代场景。通过游戏和团建活动的类比,展示了两者在多线程同步中的应用。
摘要由CSDN通过智能技术生成

一、前言

CountDownLatch和CyclicBarrier的功能看起来很相似,不易区分,有一种谜之的神秘。本文将通过通俗的例子并结合代码讲解两者的使用方法和区别。

CountDownLatch和CyclicBarrier都是java.util.concurrent包下面的多线程工具类。

从字面上理解,CountDown表示减法计数,Latch表示门闩的意思,计数为0的时候就可以打开门闩了。Cyclic Barrier表示循环的障碍物。两个类都含有这一个意思:对应的线程都完成工作之后再进行下一步动作,也就是大家都准备好之后再进行下一步。然而两者最大的区别是,进行下一步动作的动作实施者是不一样的。这里的“动作实施者”有两种,一种是主线程(即执行main函数),另一种是执行任务的其他线程,后面叫这种线程为“其他线程”,区分于主线程。对于CountDownLatch,当计数为0的时候,下一步的动作实施者是main函数;对于CyclicBarrier,下一步动作实施者是“其他线程”。

1.1、备注

备注:这里我们使用主线程(即main函数)来创建CountDown和CyclicBarrier对象。所以上文将线程分为“主线程”和“其它线程”两类,主要是便于大家理解。需要提醒读者的是,不单单是主线程可以创建该对象,其它当前正在运行的线程也可以创建CountDown和CyclicBarrier对象,此时该current thread扮演了“主线程”的角色。因此,更加准确的方式是将线程分为“当前线程”和“其它线程”,前者表示创建CountDown和CyclicBarrier对象的线程。希望这个备注没有给大家带来更大的困惑。

二、CountDownLatch

2.1、CountDownLatch说明

对于CountDownLatch,其他线程为游戏玩家,比如英雄联盟,主线程为控制游戏开始的线程。在所有的玩家都准备好之前,主线程是处于等待状态的,也就是游戏不能开始。当所有的玩家准备好之后,下一步的动作实施者为主线程,即开始游戏。
我们使用代码模拟这个过程,我们模拟了三个玩家,在三个玩家都准备好之后,游戏才能开始。代码的输出结果为:

正在等待所有玩家准备好
player0 已经准备好了, 所使用的时间为 1.235s

player2 已经准备好了, 所使用的时间为 1.279s

player3 已经准备好了, 所使用的时间为 1.358s

player1 已经准备好了, 所使用的时间为 2.583s

开始游戏

2.2、CountDownLatch代码
import java.util.Random;
import java.util.concurrent.CountDownLatch;

public class CountDownLatchTest {
   

    public static void main(String[] args) throws InterruptedException {
   
        CountDownLatch latch = new CountDownLatch(4);
        for(int i = 0; i < latch.getCount(); i++){
   
            new Thread(new MyThread(latch), "player"+i).start
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值