Java并发之CountDownLatch使用

news/2024/5/20 7:16:37 标签: 1024程序员节, juc, 并发, CountDownLatch, 定时任务
juc包下有个类叫CountDownLatch
CountDownLatch不是锁,主要作用是使一个线程等待其他线程各自执行完毕后再执行,通过计数器来实现的。
计数器是无法重置的,当计数器被减到0时,调用await方法都会直接返回。
执行countDown方法的线程不会进行阻塞,执行awit方法的线程才会阻塞。同时也可以设置等待过期时间,等待时间过后开始执行。

场景一:普通场景

	public static void main(String[] args) {
		System.out.println("start latch");
        Thread[] threads = new Thread[100];
        // CountDownLatch在初始化时,计数器初始值就是线程的数量。
        CountDownLatch latch = new CountDownLatch(threads.length);
        for(int i = 0;i<threads.length;i++){
            threads[i] = new Thread(()->{
                int result = 0;
                for (int j = 0; j < 10000; j++) {
                    result+=j;
                }
                // 当调用countDown方法时,计数器会被减1;
                latch.countDown();
            });
        }
        
		for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
        
        System.out.println("计数器值:"+latch.getCount());
        
         try{
	        // 当计数器的值变为0时,在CountDownLatch上await()的线程就会被唤醒,否则一直阻塞
	        // 典型生活场景比如:打麻将,只有4人都到时,打麻将主线程才会启动
            latch.await();
         }catch (InterruptedException e){
             e.printStackTrace();
         }
        System.out.println("end latch");
    }

超出指定等待时间也会直接返回

// 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。
boolean await(long timeout, TimeUnit unit)

场景二:配合使用信号量可以做一个定时任务
线程池可以使用ExecutorService直接new一个固定数量的线程池

// 从接口读取一批数据
List<Data> list = apiUtils.getList();
// 通过计数器实现CountDownLatch,参数为这批数据的大小
CountDownLatch latch = new CountDownLatch(list.size());
// for循环执行这批数据,循环体内用线程池处理每条数据,每条数据处理完countDown
for(Object data:list){
	线程池.execute(new JobTask(latch,list)
}
// 最后await释放计数器CountDownLatch
latch.await()
class JobTask implements Runnable{
	CountDownLatch countDownLatch;
	Object data;
	public JobTask(CountDownLatch latch,Object data){
		this.countDownLatch = latch;
		this.data = data;
	}
	@Override
	public void run(){
		doSomething();
		countDownLatch.countDown();
	}
}

http://www.niftyadmin.cn/n/5119498.html

相关文章

制作macOS Ventura U盘启动盘教程

macOS 14更新一段时间了&#xff0c;发现某些应用不适配想要无损降级&#xff0c;如何进行macOS的降级呢&#xff0c;除了备份好的时间机器备份&#xff0c;还需要一个可以引导的macOS U盘安装器&#xff0c;如何制作macOS 13 Ventura 系统启动U盘呢&#xff0c;小编带来对新手…

Lua与C++交互

文章目录 1、Lua和C交互2、基础练习2.1、加载Lua脚本并传递参数2.2、加载脚本到stable&#xff08;包&#xff09;2.3、Lua调用c语言接口2.4、Lua实现面向对象2.5、向脚本中注册c的类 1、Lua和C交互 1、lua和c交互机制是基于一个虚拟栈&#xff0c;C和lua之间的所有数据交互都通…

ArrayList与List的层级关系及ArrayList解析

List与ArrayList的关系 List List是一个接口&#xff0c;不能直接实例化。如果要使用必须去实例化List的实现类——ArrayList和LinkedList站在数据结构的角度看&#xff0c;List就是一个线性表。常见的线性表&#xff1a;顺序表、链表、栈、队列等 线性表 线性表是n个具有相…

[Unity]给场景中的3D字体TextMesh增加描边方案一

取你的文本对象&#xff0c;简单地添加以下脚本: using UnityEngine; using System.Collections; using UnityEngine.UI;public class TextOutline : MonoBehaviour {public float pixelSize 1;public Color outlineColor Color.black;public bool resolutionDependant fal…

渗透攻击漏洞之——原型链污染

背景 2019年初&#xff0c;Snyk的安全研究人员披露了流行的JavaScript库Lodash中一个严重漏洞的详细信息&#xff0c;该漏洞使黑客能够攻击多个Web应用程序&#xff0c;这个安全漏洞就是一个“原型污染漏洞”&#xff08;JavaScript Prototype Pollution&#xff09;&#xff…

【JAVA学习笔记】34 - 房屋出租系统(综合性强)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_chapter09/src/com/yinhai/houserent 一、项目需求说明 实现基于文本界面的房屋出租系统&#xff0c;能够实现对房屋信息的添加、修改和删除&#xff08;用数组实现&#xff09;&#xff0c;并能够…

【进程概念③】:进程环境变量/进程切换

深入篇【Linux】学习必备&#xff1a;进程环境变量/进程切换 Ⅰ.环境变量Ⅱ.深层意义Ⅲ.全局属性Ⅳ.进程切换 Ⅰ.环境变量 1.环境变量是什么&#xff1f;&#xff1a;环境变量是系统提供的一组name/value形式的变量&#xff0c;不同的环境变量有不同的用户。 一般是用来指定操作…