Java并发编程:CountDownLatch深度解析与应用示例
184 浏览量
更新于2024-08-03
收藏 17KB DOCX 举报
"CountDownLatch是一个在Java并发编程中常用的同步工具类,用于协调多个线程间的协作。它基于一个可递减的计数器,初始化时设置为线程的数量。线程开始执行后,每次调用`countDown()`方法,计数器减1。当计数器的值变为0时,所有等待在`await()`方法上的线程会被释放,继续执行。"
CountDownLatch的核心在于它的两个主要方法:
1. `await()`: 这个方法使得调用它的线程暂停,进入等待状态,直到计数器归零或当前线程被中断。一旦计数器为0,所有等待的线程都会被唤醒,可以继续执行后续任务。如果在等待期间调用了`interrupt()`方法中断线程,`await()`也会立即返回。
2. `countDown()`: 这个方法由那些完成任务的线程调用,每次调用都会将计数器减1。当计数器达到0时,意味着所有预先设定的任务已经完成,可以解除等待。
此外,`CountDownLatch`还提供了以下辅助方法:
- `await(long timeout, TimeUnit unit)`:与`await()`类似,但增加了超时机制。如果在指定的时间内计数器仍未归零,等待的线程将不再阻塞并返回,允许程序继续执行。
- `getCount()`: 返回当前计数器的值,可用于检查还有多少任务未完成。
下面是一个简单的使用CountDownLatch的例子,展示了如何使用它来确保所有工作线程完成后再执行等待线程:
```java
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
// 创建一个CountDownLatch,计数值为3,表示有3个工作线程
CountDownLatch c = new CountDownLatch(3);
// 2个等待线程
WaitThread waitThread1 = new WaitThread("wait-thread-1", c);
WaitThread waitThread2 = new WaitThread("wait-thread-2", c);
// 3个工作线程
Worker worker1 = new Worker("worker-thread-1", c);
Worker worker2 = new Worker("worker-thread-2", c);
Worker worker3 = new Worker("worker-thread-3", c);
// 启动所有线程
waitThread1.start();
waitThread2.start();
Thread.sleep(1000); // 防止主进程过早结束
worker1.start();
worker2.start();
worker3.start();
}
}
class WaitThread extends Thread {
private String name;
private CountDownLatch c;
public WaitThread(String name, CountDownLatch c) {
this.name = name;
this.c = c;
}
@Override
public void run() {
try {
c.await(); // 等待所有工作线程完成
System.out.println(name + " 继续执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Worker extends Thread {
private String name;
private CountDownLatch c;
public Worker(String name, CountDownLatch c) {
this.name = name;
this.c = c;
}
@Override
public void run() {
System.out.println(name + " 开始执行");
// 模拟工作
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
c.countDown(); // 工作完成,计数器减1
System.out.println(name + " 完成执行");
}
}
```
在这个例子中,主程序创建了3个工作线程和2个等待线程,并设置了一个初始值为3的CountDownLatch。工作线程执行完后调用`countDown()`,等待线程通过`await()`等待计数器归零。这样,所有工作线程完成后再执行等待线程,实现了线程间的同步。
CountDownLatch在实际应用中非常常见,例如在测试、分布式计算、多线程协同处理等场景下。通过它,开发者可以有效地控制线程的执行顺序和同步,避免数据竞争,提高程序的健壮性。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2022-06-21 上传
2023-06-15 上传
2022-06-21 上传
2023-05-25 上传
2023-07-15 上传
Java毕设王
- 粉丝: 9150
- 资源: 1095
最新资源
- JHU荣誉单变量微积分课程教案介绍
- Naruto爱好者必备CLI测试应用
- Android应用显示Ignaz-Taschner-Gymnasium取消课程概览
- ASP学生信息档案管理系统毕业设计及完整源码
- Java商城源码解析:酒店管理系统快速开发指南
- 构建可解析文本框:.NET 3.5中实现文本解析与验证
- Java语言打造任天堂红白机模拟器—nes4j解析
- 基于Hadoop和Hive的网络流量分析工具介绍
- Unity实现帝国象棋:从游戏到复刻
- WordPress文档嵌入插件:无需浏览器插件即可上传和显示文档
- Android开源项目精选:优秀项目篇
- 黑色设计商务酷站模板 - 网站构建新选择
- Rollup插件去除JS文件横幅:横扫许可证头
- AngularDart中Hammock服务的使用与REST API集成
- 开源AVR编程器:高效、低成本的微控制器编程解决方案
- Anya Keller 图片组合的开发部署记录