JAVA中CountDownLatch使用方法

CountDownLatch简单使用

CountDownLatch是一个倒计时锁存器,用来实现线程之间的同步操作

1.创建一个runable实现类

java 复制代码
public class Worker implements Runnable {
    private List<String> outputScraper;
    private CountDownLatch countDownLatch;

    public Worker(List<String> outputScraper, CountDownLatch countDownLatch) {
        this.outputScraper = outputScraper;
        this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
        doSomeWork();
        outputScraper.add("countDown");
        countDownLatch.countDown();
    }
}

2.创建测试类

java 复制代码
@Test
public void test() throws InterruptedException {

    List<String> outputScraper = Collections.synchronizedList(new ArrayList<>());
    CountDownLatch countDownLatch = new CountDownLatch(5);
    List<Thread> workers = Stream
    .generate(() -> new Thread(new Worker(outputScraper, countDownLatch)))
    .limit(5)
    .collect(toList());

    workers.forEach(Thread::start);
    countDownLatch.await(); 
    outputScraper.add("latchReleased");

    assertThat(outputScraper).containsExactly("countDown","countDown","countDown","countDown","countDown","latchReleased");
}

此方法中创建了一个线程安全List和一个倒计时锁存器,锁存计数值为5,再创建5个线程执行Worker任务,传入的参数是同一个List和CountDownLatch,然后启动全部线程,在任务的run方法的最后调用countDownLatch.countDown()使计数器-1,在主线程中调用countDownLatch.await()等待计数器为0,然后再继续执行后面代码,保证了outputScraper.add("latchReleased")是在所有的outputScraper.add("countDown")之后才添加的。

异常处理

如果任务中途出现异常导致计数器锁存器不能正常-1,导致主线程一直等不到计数器为0,解决办法:

java 复制代码
boolean completed = countDownLatch.await(3L, TimeUnit.SECONDS);

设置超时时间,如果规定时间内等待不到计数器清零则返回false。

相关推荐
木子江L1 分钟前
SpringBoot集成RabbitMQ消息中间件
java·spring boot·rabbitmq·java-rabbitmq
Gao_xu_sheng2 分钟前
IDEA恢复删除模块pom文件
java·spring boot·idea
计算机毕设指导66 分钟前
基于微信小程序的直播带货商品数据分析系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea
TTGGGFF2 小时前
Supertonic 部署与使用全流程保姆级指南(附已部署镜像)
开发语言·python
木木木一2 小时前
Rust学习记录--C7 Package, Crate, Module
开发语言·学习·rust
love530love2 小时前
升级到 ComfyUI Desktop v0.7.0 版本后启动日志报 KeyError: ‘tensorrt‘ 错误解决方案
开发语言·windows·python·pycharm·virtualenv·comfyui·comfyui desktop
Evand J3 小时前
【MATLAB例程】【空地协同】UAV辅助的UGV协同定位,无人机辅助地面无人车定位,带滤波,附MATLAB代码下载链接
开发语言·matlab·无人机·无人车·uav·协同定位·ugv
chao1898443 小时前
基于MATLAB实现多变量高斯过程回归(GPR)
开发语言·matlab·回归
ytttr8738 小时前
隐马尔可夫模型(HMM)MATLAB实现范例
开发语言·算法·matlab
天远Date Lab8 小时前
Python实战:对接天远数据手机号码归属地API,实现精准用户分群与本地化运营
大数据·开发语言·python