返回
CyclicBarrier与CountDownLatch有什么区别?
后端
2024-02-09 16:31:46
CyclicBarrier 和 CountDownLatch 是 Java 并发编程中的两个重要类,它们都有助于协调多个线程之间的操作。但是,它们在使用上有不同的目的和特性,了解它们之间的区别对于在 Java 并发编程中做出正确的选择非常重要。
等待条件
CyclicBarrier 的等待条件是所有参与的线程都到达屏障点,然后它们才能继续执行。CountDownLatch 的等待条件是计数器减为 0,然后所有等待的线程才能继续执行。
重用性
CyclicBarrier 可以被重复使用,这意味着它可以在多个线程组之间共享。CountDownLatch 是一个一次性的类,一旦计数器减为 0,它就不能再被使用了。
线程数量
CyclicBarrier 需要知道参与的线程数量,以便在所有线程都到达屏障点后释放它们。CountDownLatch 不需要知道参与的线程数量,它只需要知道需要等待的次数。
使用场景
CyclicBarrier 适用于需要协调多个线程同时执行某个任务的情况,例如在所有线程都完成各自的任务后才开始下一个阶段的处理。CountDownLatch 适用于需要等待某个事件发生的情况,例如等待所有线程都完成任务或等待某个资源变得可用。
示例代码
CyclicBarrier 的示例代码如下:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
// 创建一个CyclicBarrier,它将等待4个线程到达屏障点
CyclicBarrier barrier = new CyclicBarrier(4);
// 创建4个线程,每个线程都会尝试到达屏障点
for (int i = 0; i < 4; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + "到达屏障点");
// 等待所有线程都到达屏障点
barrier.await();
System.out.println(Thread.currentThread().getName() + "继续执行");
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
}
CountDownLatch 的示例代码如下:
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) {
// 创建一个CountDownLatch,它将等待3个线程完成任务
CountDownLatch latch = new CountDownLatch(3);
// 创建3个线程,每个线程都会执行一个任务并调用countDown()方法
for (int i = 0; i < 3; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + "开始执行任务");
// 执行任务
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "完成任务");
// 调用countDown()方法,表示一个线程已完成任务
latch.countDown();
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
// 等待所有线程都完成任务
try {
latch.await();
System.out.println("所有线程都已完成任务");
} catch (Exception e) {
e.printStackTrace();
}
}
}
总结
CyclicBarrier 和 CountDownLatch 是 Java 并发编程中的两个重要类,它们都有助于协调多个线程之间的操作。但是,它们在使用上有不同的目的和特性,了解它们之间的区别对于在 Java 并发编程中做出正确的选择非常重要。