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。

相关推荐
hdsoft_huge15 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
研华嵌入式15 小时前
如何在高通跃龙QCS6490 Arm架构上使用Windows 11 IoT企业版?
arm开发·windows·嵌入式硬件
风中的微尘15 小时前
39.网络流入门
开发语言·网络·c++·算法
雨白16 小时前
Java 多线程指南:从基础用法到线程安全
android·java
Hungry_Shark16 小时前
IDEA版本控制管理之使用Gitee
java·gitee·intellij-idea
赛姐在努力.16 小时前
《IDEA 突然“三无”?三秒找回消失的绿色启动键、主菜单和项目树!》
java·intellij-idea
未来之窗软件服务16 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
猎板PCB黄浩16 小时前
从废料到碳减排:猎板 PCB 埋容埋阻的绿色制造革命,如何实现环保与性能双赢
java·服务器·制造
ZzzK,16 小时前
JAVA虚拟机(JVM)
java·linux·jvm
西红柿维生素16 小时前
JVM相关总结
java·jvm·算法