使用场景
假设有一个列表,多选之后,点击压缩。此时后台肯定是多线程跑压缩任务,那我们就可以使用 CountDownLatch
来在全部压缩完成之后处理一些事情。
示例代码
public class testMain {
public static void main(String[] args) {
//初始化计数
AtomicInteger count = new AtomicInteger(0);
//创建10个线程
ExecutorService es = Executors.newFixedThreadPool(10);
//设置CountDownLatch为10
CountDownLatch countDownLatch = new CountDownLatch(10);
for (int i = 0; i < 10; i++) {
es.execute(() -> {
//每个线程累计增加1000次
for (int j = 0; j < 1000; j++) {
count.addAndGet(1);
}
//线程最后执行CountDownLatch
countDownLatch.countDown();
});
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
;
System.out.println(count);
}
}
可以看到,CountDownLatch 与 CyclicBarrier 非常类似,由此引出几个问题:
解释一下 CountDownLatch 概念?
CountDownLatch 是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减 1。当计数器值到达 0 时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。
CountDownLatch 和 CyclicBarrier 的不同之处?
CyclicBarrier 可以重用,CountDownLatch 不可以重用。
CountDownLatch 的下一步的动作实施者是主线程
CyclicBarrier 的下一步动作实施者还是“其他线程”本身
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于