Java并发工具篇--CountDownLatch,CyclicBarrier, Semaphore 全面分析,快速掌握

前言

随着天气的逐渐变热,整个人也开始浮躁不安

当然这里说的不是我,因为我是一个比较安静的人

讲的是隔壁的老大哥,在训斥年幼的孩子

一通吼叫过后,男人安静了下来,孩子也哭个不停

简介

前面我们介绍了 JUC 中的并发容器,它相当于一个同步容器的升级版,很大程度上提高了并发的性能

今天我们来介绍 JUC 中的并发工具,它主要是通过改变自身的状态来控制线程的执行流程;

常见的有如下几种:

  • CountDownLatch:倒计时器(属于闭锁的一种实现),用来阻塞线程
  • CyclicBarrier:循环栅栏,类似倒计时器,但是比他更高级,也是用来阻塞线程(只不过阻塞的方式不同,下面会具体介绍)
  • Semaphore:信号量,用来控制多个线程同时访问指定的资源,比如我们常用的数据库连接池 下面让我们开始吧

文章如果有问题,欢迎大家批评指正,在此谢过啦

正文

1. 什么是并发工具

并发工具是一组工具类,主要是用来控制线程的执行流程,比如阻塞某个线程,以等待其他线程

2. 倒计数器 CountDownLatch

从字面意思来看,就是一个倒计数门闩(shuan,打了半天zha就是打不出来)

通俗一点来说,就是倒计数,时间一到,门闩就打开

注:一旦打开,就不能再合上,即这个 CountDownLatch 的状态改变是永久不可恢复的(记住这个点,后面会有对比)
比较官方的说法:倒计数器用来阻塞某个(某些)线程,以等待其他多个线程的任务执行完成(以这个说法为准,上面的可以用来对比参考)

下面列出 CountDownLatch 的几个方法:

  • 构造方法:public CountDownLatch(int count),其中count就是我们所说的内部状态(当count=0时,表示到达终止状态,此时会恢复被阻塞的线程)
  • 修改状态:public void countDown(),该方法会递减上面的count状态,每执行一次,就-1;(当count=0时,表示到达终止状态,此时会恢复被阻塞的线程)
  • 等待:public void await(),该方法会阻塞当前线程,直到count状态变为0,才会恢复执行(除非中断,此时会抛出中断异常)
  • 超时等待:public boolean await(long timeout, TimeUnit
    unit),类似上面的await,只不过可以设置超时时间,等过了超时时间,还在阻塞,则直接恢复
  • 获取状态值 count:public long getCount(),获取count的数值,以查看还可以递减多少次(多用来调试)
    模拟场景的话,这里先列举三个,肯定还有其他的

模拟场景的话,这里先列举三个,肯定还有其他的

  • 第一个就是计数器了,最直接的
  • 第二个就是统计任务执行时长
  • 第三个就是多人5V5游戏,等所有人加载完毕,就开始游戏

下面我们以第三个场景为例,写个例子:多人游戏加载画面

public class CountDownLatchDemo {
   
    public static void main(String[] args) throws InterruptedException {
   
        // 1. 构造一个倒计数器,给定一个状态值10
        CountDownLatch latch = new CountDownLatch(10);
        System.out.println("准备加载");
          // 这里我们创建10个线程,模拟 5V5 游戏的10个玩家
        for (int i = 0; i < 10; i++) {
   
            new Thread(()->{
   
                
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值