Java并发编程:CountDownLatch与CyclicBarrier实例对比
CountDownLatch和CyclicBarrier是Java并发库中两种常见的同步工具,它们都用于线程之间的协调。下面我们将通过实例对比这两种工具的使用场景和功能。
- CountDownLatch:
- 使用场景:当一个或多个任务完成后,会通知所有等待的任务。
- 实例示例:
```java
// 创建一个计数器,初始值为3
CountDownLatch latch = new CountDownLatch(3);
// 各个线程对latch进行操作
Thread thread1 = new Thread(() -> {
latch.countDown(); // 任务完成后,减1
}));
thread1.start();
Thread thread2 = new Thread(() -> {
latch.await(); // 等待计数器为0,阻塞线程
}));
thread2.start();
// 这个时候所有等待的线程都会被通知
2. **CyclicBarrier**:
- 使用场景:当一组线程需要在某个特定时间点“集合”时,CyclicBarrier非常适合。
- 实例示例:
```java
// 创建一个计数器,初始值为0
CyclicBarrier barrier = new CyclicBarrier(2, System.currentTimeMillis() + 500); // 5秒后关闭
Thread thread1 = new Thread(() -> {
try {
barrier.await(); // 等待计数器为1,阻塞线程
System.out.println("Thread 1 reached barrier at " + System.currentTimeMillis()); // 当计数器翻转时执行该语句
} catch (Exception e) {
e.printStackTrace();
}
});
thread1.start();
Thread thread2 = new Thread(() -> {
try {
barrier.await(); // 等待计数器为1,阻塞线程
System.out.println("Thread 2 reached barrier at " + System.currentTimeMillis()); // 当计数器翻转时执行该语句
} catch (Exception e) {
e.printStackTrace();
}
});
thread2.start();
// 这个时候两个线程会在5秒后(系统时间)同时到达barrier并打印当前时间
总结:
CountDownLatch和CyclicBarrier在Java并发编程中都扮演了重要的角色。CountDownLatch更多用于资源释放的场景,而CyclicBarrier则更适用于需要精确“集合”时间点的场合。
还没有评论,来说两句吧...