【多线程】CountDownLatch的简单实现

news2024/11/13 8:02:05

通过上一篇对CountDownLatch的使用,我们也明白了他的基本原理,接下来我们一起来实现一个CountDownLatch的基础效果

在这里插入图片描述

新建一个抽象类,包含countDownLatch需要的参数和方法

package com.atguigu.signcenter.nosafe.chouxiang;

/**
 * @author: jd
 * @create: 2024-09-03
 */
public abstract class Latch {

    // 控制了多少线程完成后门阀才能打开
    protected int limit;

    //构造函数
    public  Latch(int limit){
        this.limit =limit;
    }

    // 方法使得线程一直等待
    public abstract void await() throws InterruptedException;

    //当前任务线程完成工作之后调用该方法使得计数器减一
    public abstract void countDe();

    // 获取当前还有多少个线程没有完成任务
    public abstract int getUnArrived();


}

现这个抽象类,并写入具体逻辑代码

package com.atguigu.signcenter.nosafe.chouxiang.chouxiangImpl;

import com.atguigu.signcenter.nosafe.chouxiang.Latch;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author: jd
 * @create: 2024-09-03
 */
public class LatchImpl extends Latch {
    //创建锁对象
    private final Lock lock = new ReentrantLock();
    //创建条件对象,但是作用待深入研究
    private final Condition condition = lock.newCondition();

    //LatchImpl的构造方法,用于计数器的初始化
    public  LatchImpl(int limit){
        super(limit);
    }

    /**
     * 重写等待方法
     * @throws InterruptedException
     */
    @Override
    public void await() throws InterruptedException {
        lock.lock();
        while (limit > 0){
            //如果进入到这里面之后,在await之后,会直接释放掉锁,不走后面的unlock()了;
            condition.await();
        }
        lock.unlock();

    }

    /**
     * 重写计数器减一方法
     */
    @Override
    public void countDe() {
        lock.lock();
        while (limit<0){
            throw new IllegalStateException();
        }
        limit--;
        //对 condition.await(); 的线程进行唤醒,让他继续执行。
        condition.signalAll();
        lock.unlock();
    }

    /**
     * 重写获取 当前未完成线程方法
     * @return
     */
    @Override
    public int getUnArrived() {
        return limit;
    }
}

测试

package com.atguigu.signcenter.nosafe;

import com.atguigu.signcenter.nosafe.chouxiang.chouxiangImpl.LatchImpl;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author: jd
 * @create: 2024-09-03
 */
public class LatchTest {

    // 创建一个线程池来执行任务
    static final ThreadPoolExecutor executor = new ThreadPoolExecutor(6,10,30L,
            TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(), Executors.defaultThreadFactory());

    public static void main(String[] args) throws InterruptedException {
        LatchImpl latch = new LatchImpl(2);

        //模拟小红
        executor.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("小红出发了");
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                latch.countDe();
                System.out.println("小红到了");
            }
        });

        //模拟小明
        executor.submit(() -> {
            System.out.println("小明出发了");
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            latch.countDe();
            System.out.println("小明到了");
        });
        latch.await();
        System.out.println("都到了,一起去爬山了");
        executor.shutdown();

    }
}

测试结果:
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s集群的调度

目录 自动调度的原则 调度约束机制&#xff1a;list-watch apiserver和组件之间的watch机制 调度过程的默认算法 1.预算策略 预算的算法 2.优选策略 优选的算法 *用户定制节点部署 1.强制性节点部署 2.节点标签部署&#xff08;匹配机制&#xff09; 标签的增删改查…

selenium无法定位元素的几种解决方案

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位&#xff0c;对于frame/iframe表单内嵌的页面元素无法直接定位。 解决方法&#xff1a; d…

Hadoop 下载

下载法一&#xff1a;官方下载 hadoop官网 1.选择要下载的版本&#xff0c;这里我以3.4.0为例进行说明&#xff1b; 2.跳转后&#xff0c;选择对应系统架构的&#xff0c;进行下载&#xff1b; 下载法二&#xff1a;国内镜像源下载 1.阿里云 这里我以mac m1为案例&#x…

【已解决】Halcon错误代码4104

问题描述 在运行的时候发现报错4104&#xff0c;如下图所示 解决 从字面上理解就是超出了计算机的内存空间了&#xff0c;那么着手解决的话就需要把没次训练的张数减少一些即可。去相对应的修改batch_size即可。 结果 如下图所示&#xff0c;正常在使用GPU训练。 搞定&…

Xilinx FFT IP使用

简介 本章节主要介绍FFT原理,以及Xilinx的FFT IP使用说明做详细介绍。 FFT介绍 FFT主要是将时域信号转换成频域信号,转换后的信号更方便分析。首先,FFT是离散傅立叶变换 (DFT) 的快速算法,那么说到FFT,我们自然要先讲清楚傅立叶变换。先来看看傅立叶变换是从哪里来的? 傅…

虚拟机无法打开网卡 service network restart失败

问题描述 命令重启网卡服务&#xff0c;结果报错如下&#xff1a;Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details 根据提示&#xff…

Hi3061M开发板初测——点亮小灯

目录 前言环境配置点亮led源码IDA集成了串口监视器最后下载到开发板中运行 前言 海思MCU体验官活动&#xff0c;Hi3061M开发板到手后&#xff0c;配置环境初步测试点亮小灯。 环境配置 环境配置按照gitee提供的redeme一步一步来配置起来很顺利。具体可自行查阅&#xff1a;环境…

文件包含漏洞PHP伪协议利用方法

使用php伪协议的前提 php.ini中的allow_url_fopen 、allow_url_include这两个参数需要修改为on 1.file协议 使用file协议读取Windows的系统文件 http://127.0.0.1/123.php?cmdfile:///c:/windows/system32/drivers/etc/hosts 2.php://filter协议 使用php://filter协议可以…

JsonCpp库的使用

目录 一、Json数据格式 二、JsonCpp介绍 2.1 Json::Value 2.2 序列化接口 2.3 反序列化接口 三、JsonCpp的使用 3.1 头文件包含 3.2 序列化 3.3 反序列化 四、补充 Json 是⼀种数据交换格式&#xff0c;它采⽤完全独⽴于编程语⾔的⽂本格式来存储和表示数据。 一、J…

P01-Java何谓数组

P01-Java何谓数组 一、数组声明创建 1.1 数组声明的语法 与c有所不同 在Java中&#xff0c;数组声明语法 首选语法&#xff1a; //数据类型[] 数组名称; int[] arr;次选&#xff0c;与c类似 //数据类型 数组名称[]; int arr[];1.2 数组创建语法 与c指针有所相似&#xff0…

嵌入式开发与应用按键外部中断实验二

一、实验目的 1. 通过实验掌握中断式键盘控制与设计方法&#xff1b; 2. 熟悉编写中断服务程序; 3. 掌握中断系统相关知识&#xff0c;掌握外部中断应用方法和处理过程&#xff1b; 4. 掌握实验处理器中断处理的软件编程方法&#xff1b; 5. 从按键程序的设计对系统的编程…

Prometheus_0基础_学习笔记

一、基本概念 Prometheus是由golang语言开发的一套开源的监控、报警、时间序列数据库的组合&#xff0c;是一款基于时序数据库的开源监控告警系统。 时间序列数据库&#xff1a;时间序列数据库&#xff08;Time Serires Database , TSDB&#xff09;不同于传统的关系型数据库。…

是缔造AI程序员,还是AI缔造程序员?

随着AIGC&#xff08;如ChatGPT、MidJourney、Claude等&#xff09;大语言模型的涌现&#xff0c;AI辅助编程工具的普及使得程序员的工作方式正在发生深刻变革。AI的迅猛发展&#xff0c;不仅提升了编程效率&#xff0c;也引发了对程序员未来职业前景的深思。我们应当如何在这一…

【归并分而治之】逆序对的应对之策

目录 1.前言2.题目简介3.求解思路为什么要这样做&#xff1f;快在哪&#xff1f;为什么这种方法会想到结合归并排序&#xff1f;如何在一左一右中统计剩下的逆序对个数&#xff1f;固定右边的数&#xff0c;用降序会怎么样&#xff1f;&#xff1f;&#xff1f;思路的本质是巧妙…

【MySQL07】【锁】

文章目录 一、前言二、事务的读写情况1. 写-写情况2. 读-写情况3. 一致性读4. 锁定读2.1 共享锁和独占锁2.2 锁定读的语句 5. 写操作 三、多粒度锁四、表锁和行锁1. 表级锁1.1 表级别的 S锁 和 X锁1.2 表级别的 IS 锁和 IX锁1.3 表级别的 AUTO-INC 锁 2. 行级锁2.1 行级锁的分类…

Qt6+VTK9环境配置

Qt6VTK9环境配置 说明1 Qt6安装2 VTK源码编译2.1 源码下载2.2 工程编译2.3 设置环境变量 3 QtVTK项目构建3.1 使用qmake管理项目3.2 使用cmake管理项目 参考资料 说明 由于想做一点新的东西&#xff0c;需要去探索一些工具&#xff0c;对于VTK之前没有了解过&#xff0c;在进行…

redis缓存和数据库通过延迟双删除实现数据一致性

为了提高查询的效率&#xff0c;我们经常会用到redis缓存&#xff0c;但是使用redis缓存就不可避免缓存一致性的问题。 先删缓存&#xff0c;再更新数据 如果并发查询可能会再删除缓存后&#xff0c;还没有更新数据库的时候&#xff0c;第二个线程读取到旧数据&#xff0c;并…

尚品汇-商品上下架完善(更新ES)、延迟消息(四十四)

目录&#xff1a; &#xff08;1&#xff09;改造商品搜索上下架 &#xff08;2&#xff09;延迟消息 &#xff08;1&#xff09;改造商品搜索上下架 定义商品上下架常量 在rabbit-util模块中导入常量类MqConst。 /*** 商品上下架.*/ public static final String EXCHANGE…

游戏翻译中西班牙语的特点

由于西班牙语丰富的文化多样性和广泛的使用&#xff0c;将游戏翻译成西班牙语带来了独特的机遇和挑战。西班牙语是全球第二大使用语言&#xff0c;包括西班牙、拉丁美洲和美国部分地区在内的各个地区有超过4.6亿母语人士。然而&#xff0c;这些地区的语言和文化差异需要量身定制…

Datawhale X 李宏毅苹果书 AI夏令营-深度学习进阶task1:局部极小值与鞍点,批量和动量

一、临界点和鞍点 在做优化的时候经常会发现&#xff0c;随着参数不断更新&#xff0c;训练的损失不会再下降, 但是我们对这个损失仍然不满意或者有时模型一开始就训练不起来&#xff0c;不管我们怎么更新参数&#xff0c;损失都降不下去。 过去常见的一个猜想是我们优化到某…