JUC系列之(五)CountDownLatch闭锁
CountDownLatch闭锁
闭锁:延迟当前线程的进度,直到其他线程都执行完成当前线程才继续执行。
示例:计算多线程操作耗费时间
以下操作时无法正常计算多线程操作耗时的
package com.atguigu.juc;
public class TestCountDownLatch {
public static void main(String[] args) {
LatchDemo latchDemo = new LatchDemo();
long start = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
new Thread(latchDemo).start();
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
class LatchDemo implements Runnable{
@Override
public void run() {
for (int i = 0; i < 50000; i++) {
if (i % 2 == 0){
System.out.println(i);
}
}
}
}
使用闭锁改造为如下即可
package com.atguigu.juc;
import java.util.concurrent.CountDownLatch;
public class TestCountDownLatch {
public static void main(String[] args) {
// 这里的10要和线程个数一致
CountDownLatch countDownLatch = new CountDownLatch(10);
LatchDemo latchDemo = new LatchDemo(countDownLatch);
long start = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
new Thread(latchDemo).start();
}
try {
// countDownLatch的值为 0 时主线程会继续执行
countDownLatch.await();
} catch (InterruptedException e) {
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
}
}
class LatchDemo implements Runnable{
private CountDownLatch latch;
LatchDemo(CountDownLatch latch){
this.latch = latch;
}
@Override
public void run() {
synchronized (this) {
try {
for (int i = 0; i < 50000; i++) {
if (i % 2 == 0){
System.out.println(i);
}
}
}finally {
// 每个线程执行完都会减1
latch.countDown();
}
}
}
}
注:汇总类的业务中可能会用到
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构