Java并发编程:CountDownLatch与CyclicBarrier实例对比

原创 野性酷女 2024-12-10 09:09 109阅读 0赞

CountDownLatch和CyclicBarrier是Java并发库中两种常见的同步工具,它们都用于线程之间的协调。下面我们将通过实例对比这两种工具的使用场景和功能。

  1. 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();

// 这个时候所有等待的线程都会被通知

  1. 2. **CyclicBarrier**:
  2. - 使用场景:当一组线程需要在某个特定时间点“集合”时,CyclicBarrier非常适合。
  3. - 实例示例:
  4. ```java
  5. // 创建一个计数器,初始值为0
  6. CyclicBarrier barrier = new CyclicBarrier(2, System.currentTimeMillis() + 500); // 5秒后关闭
  7. Thread thread1 = new Thread(() -> {
  8. try {
  9. barrier.await(); // 等待计数器为1,阻塞线程
  10. System.out.println("Thread 1 reached barrier at " + System.currentTimeMillis()); // 当计数器翻转时执行该语句
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. });
  15. thread1.start();
  16. Thread thread2 = new Thread(() -> {
  17. try {
  18. barrier.await(); // 等待计数器为1,阻塞线程
  19. System.out.println("Thread 2 reached barrier at " + System.currentTimeMillis()); // 当计数器翻转时执行该语句
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. });
  24. thread2.start();
  25. // 这个时候两个线程会在5秒后(系统时间)同时到达barrier并打印当前时间

总结:
CountDownLatch和CyclicBarrier在Java并发编程中都扮演了重要的角色。CountDownLatch更多用于资源释放的场景,而CyclicBarrier则更适用于需要精确“集合”时间点的场合。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,109人围观)

还没有评论,来说两句吧...

相关阅读