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。

相关推荐
水云桐程序员2 小时前
C++可以写手机应用吗
开发语言·c++·智能手机
测试员周周3 小时前
【AI测试智能体】为什么传统测试方法对智能体失效?
开发语言·人工智能·python·功能测试·测试工具·单元测试·测试用例
RSTJ_16253 小时前
PYTHON+AI LLM DAY THREETY-NINE
开发语言·人工智能·python
陈葛杰3 小时前
Axure RP 10.0安装教程(傻瓜版)
windows·开源软件·axure
想学习java初学者4 小时前
SpringBoot整合Vertx-Mqtt多租户(优化版)
java·spring boot·后端
AC赳赳老秦4 小时前
政企内网落地:OpenClaw 离线环境深度适配方案,无外网场景下本地化模型对接与全功能使用
java·大数据·运维·python·自动化·deepseek·openclaw
赏金术士4 小时前
Kotlin 从入门到进阶 之函数模块(核心基础)(二)
android·开发语言·kotlin
weixin_449173654 小时前
在 Java 中,‌线程安全的 List‌ 主要有以下几种实现方式,它们的效率取决于具体的使用场景(尤其是读写比例):
java·线程安全的list
砚底藏山河4 小时前
股票数据API接口:如何获取股票历历史分时KDJ数据
java·python·maven
MegaDataFlowers6 小时前
运行若依项目
java