使用countdownlatch与CompleteFuture实现同步等待的区别
时间: 2023-03-31 16:03:29 浏览: 316
使用CountDownLatch和CompletableFuture都可以实现同步等待的功能,但是它们的实现方式有所不同。CountDownLatch是一种基于计数器的同步工具,可以让一个或多个线程等待其他线程完成操作后再执行。而CompletableFuture是一种异步编程的方式,可以让我们在一个线程中等待另一个线程的结果,而不需要阻塞当前线程。此外,CompletableFuture还支持链式调用和异常处理等功能,更加灵活和方便。
相关问题
使用CountDownLatch
CountDownLatch是Java中的一个同步工具类,它可以让一个或多个线程等待其他线程完成操作后再执行。下面是一个使用CountDownLatch的示例:
```java
import java.util.concurrent.CountDownLatch;
public class Example {
public static void main(String[] args) throws InterruptedException {
int threadCount = 5;
CountDownLatch latch = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
new Thread(() -> {
// 线程执行的操作
System.out.println(Thread.currentThread().getName() + " 执行完毕");
latch.countDown();
}).start();
}
latch.await();
System.out.println("所有线程执行完毕");
}
}
```
上面的示例中,我们创建了一个CountDownLatch对象,并将计数器初始化为5。然后创建了5个线程,每个线程执行完毕后都会调用countDown()方法来减少计数器的值。最后,主线程调用await()方法来等待所有线程执行完毕。
以下关于 CountDownLatch 和 CyclicBarrier 的描述中,哪一项是错误的? A. CountDownLatch 与 CyclicBarrier 都是 java.util.concurrent 包下的线程同步工具类 B. CountDownLatch 与 CyclicBarrier 都可以用于“主线程阻塞一直等待,直到子任务完成,主线程才继续执行”的情况 C. CountDownLatch 的 await()方法会等待计数器归 0,而 CyclicBarrier 的 await()会等待其他线程到达 barrier point D. CountDownLatch 是由 Lock 和 Condition 实现的,而 CyclicBarrier 是由同步控制器 AQS 实现的
选项 D 中的描述是错误的。
CountDownLatch 和 CyclicBarrier 都是 java.util.concurrent 包下的线程同步工具类,都可以用于协调多个线程之间的执行顺序,等待其他线程执行完成等情况。
CountDownLatch 的 await() 方法会等待计数器归 0,而 CyclicBarrier 的 await() 方法会等待其他线程到达 barrier point,即等待所有线程都到达同一个屏障点,然后再一起继续执行。
CountDownLatch 是由 AQS 实现的,而 CyclicBarrier 也是由 AQS 实现的。AQS 是 AbstractQueuedSynchronizer 的缩写,是一个提供了基于锁和条件变量的同步框架的抽象类,CountDownLatch 和 CyclicBarrier 都是基于 AQS 的实现。
因此,选项 D 中的描述是错误的。
阅读全文