前言
随着天气的逐渐变热,整个人也开始浮躁不安
当然这里说的不是我,因为我是一个比较安静的人
讲的是隔壁的老大哥,在训斥年幼的孩子
一通吼叫过后,男人安静了下来,孩子也哭个不停
简介
前面我们介绍了 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(()->{