当前位置: 首页 > news >正文

Java进阶常用的辅助类(CountDownLatch 减法计数器、CyclicBarrier 加法计数器、Semaphore 信号量)

文章目录

  • Java进阶常用的辅助类(CountDownLatch 减法计数器、CyclicBarrier 加法计数器、Semaphore 计数信号量)
    • 一、CountDownLatch 减法计数器
      • 1、简介
      • 2、代码案例
      • 3、原理
    • 二、CyclicBarrier 加法计数器
      • 1、简介
      • 2、代码案例
    • 三、Semaphore 信号量
      • 1、简介
      • 2、代码案例
      • 3、原理


Java进阶常用的辅助类(CountDownLatch 减法计数器、CyclicBarrier 加法计数器、Semaphore 计数信号量)

一、CountDownLatch 减法计数器

1、简介

  • 减法计数器
  • 允许一个或多个线程等待直到其它线程中执行的一组操作完成的同步辅助

2、代码案例

package com.sgz.add;

import java.util.concurrent.CountDownLatch;

/**
 * 日期:2022/8/29 - 13:46
 * 需求:减法计数器
 */
public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        // 总数是6,必须要执行任务的时候,再使用
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "Go out");
                countDownLatch.countDown(); // 数量-1
            }, String.valueOf(i)).start();
        }
        countDownLatch.await(); // 等待计数器归零,然后再向下执行
        System.out.println("Close Door");

    }
}

3、原理

  • countDownLatch.countDown(); // 数量-1
  • countDownLatch.await(); // 等待计数器归零,然后再向下执行
  • 每次有线程调用countDown()数量-1,假设计数器变为0, countDownLatch.await(); 就会被唤醒,继续执行!

二、CyclicBarrier 加法计数器

1、简介

  • 加法计数器
  • 允许一组线程全部等待彼此达到共同屏障点的同步辅助

2、代码案例

package com.sgz.add;

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

/**
 * 日期:2022/8/29 - 13:55
 * 需求:集齐7颗龙珠召唤神龙
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
            System.out.println("召唤神龙成功!");
        });

        for (int i = 1; i <= 7; i++) {
            // Lambda能操作到变量 i 吗
            final int temp = i;
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "收集" + temp + "个龙珠");
                try {
                    cyclicBarrier.await();  // 等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

三、Semaphore 信号量

1、简介

  • 信号量
  • 一个计数信号量。在概念上,信号量维持一组许可证。如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。

2、代码案例

package com.sgz.add;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * 日期:2022/8/29 - 14:29
 * 需求:抢车位!6车---3个停车位置
 */
public class SemaphoreDemo {
    public static void main(String[] args) {
        // 线程数量:停车位!限流!
        Semaphore semaphore = new Semaphore(3);

        for (int i = 1; i <= 6; i++) {
            new Thread(()->{
                try {
                    // acquire()    得到
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "抢到车位");
                    TimeUnit.SECONDS.sleep(2);
                    System.out.println(Thread.currentThread().getName() + "离开车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    // release()    释放
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }

    }
}

3、原理

  • semaphore.acquire(); // 获取,假设如果已经满了,等待,等待被释放为止
  • semaphore.release(); // 释放,会将当前的信号量释放 +1,然后唤醒等待的线程
  • 作用:多个共享资源互斥的使用!并发限流,控制最大的线程数!

相关文章:

  • HWI的安装及使用
  • 【数据库】MySQL(索引、数据结构、性能、锁、事务等)面试题
  • Cython代码加密, 使用 Cython 将 Python 代码编译为二进制(将整个Django项目编译成功并部署)
  • C# 程序开机自动启动
  • html2canvs的一些问题
  • 金仓数据库 KingbaseES 插件参考手册 S(3)
  • Flutter聊天布局之图片视频上传、显示、保存到相册
  • Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution
  • 基于SSM框架实现学生管理系统
  • JavaScript聊天框插入表情: 点击表情时输入框失焦, 无法插入到输入框.
  • 使用esxcli命令升级VMware ESXi补丁
  • java调用python文件的几种方式【超细讲解!】
  • c++ 关于bfs和dfs的相对统一写法
  • 2023年湖北三类人员安全员A证报考条件需要什么资料?
  • Maven进阶-多环境开发与跳过测试
  • .pyc 想到的一些问题
  • angular学习第一篇-----环境搭建
  • CSS魔法堂:Absolute Positioning就这个样
  • CSS实用技巧
  • ESLint简单操作
  • HashMap剖析之内部结构
  • HTTP请求重发
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Laravel Telescope:优雅的应用调试工具
  • Median of Two Sorted Arrays
  • SQLServer之创建数据库快照
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 初识 webpack
  • 大数据与云计算学习:数据分析(二)
  • 目录与文件属性:编写ls
  • 手写双向链表LinkedList的几个常用功能
  • 移动端 h5开发相关内容总结(三)
  • 再次简单明了总结flex布局,一看就懂...
  • 再谈express与koa的对比
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # 数论-逆元
  • ###C语言程序设计-----C语言学习(6)#
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $forceUpdate()函数
  • (12)Hive调优——count distinct去重优化
  • (4)STL算法之比较
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (办公)springboot配置aop处理请求.
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (七)Java对象在Hibernate持久化层的状态
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)jdk与jre的区别
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net core webapi 大文件上传到wwwroot文件夹
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET HttpWebRequest、WebClient、HttpClient