使用countdownlatch与CompleteFuture实现同步等待的区别
时间: 2023-03-31 15:03:29 浏览: 137
使用CountDownLatch和CompletableFuture都可以实现同步等待的功能,但是它们的实现方式有所不同。CountDownLatch是一种基于计数器的同步工具,可以让一个或多个线程等待其他线程完成操作后再执行。而CompletableFuture是一种异步编程的方式,可以让我们在一个线程中等待另一个线程的结果,而不需要阻塞当前线程。此外,CompletableFuture还支持链式调用和异常处理等功能,更加灵活和方便。
相关问题
ReentryLock与CountDownLatch在实现AQS方面有什么差别
ReentrantLock和CountDownLatch在实现AQS方面有一些差别。ReentrantLock是通过继承AQS的内部类Sync来实现的,而CountDownLatch则是通过继承AQS的子类Sync来实现的。这两个类在实现AQS时的主要差别在于它们对tryAcquire方法的实现。
在ReentrantLock中,tryAcquire方法的实现允许同一个线程多次获取锁,即可重入锁的概念。当state为0时,表示没有任何线程持有锁;当state为1时,表示某一个线程拿到了一次锁;当state大于1时,表示这个线程获取了多次锁。这种实现方式使得ReentrantLock可以支持同一个线程多次获取锁,从而实现了可重入锁的特性。
而在CountDownLatch中,tryAcquire方法的实现没有考虑可重入锁的概念。当state为0时,表示没有任何线程持有锁;当state为1时,表示某一个线程拿到了锁。CountDownLatch的主要作用是在一个或多个线程等待其他线程完成某些操作后再继续执行,而不是用于实现可重入锁的功能。
因此,ReentrantLock和CountDownLatch在实现AQS方面的差别主要体现在它们对tryAcquire方法的不同实现,ReentrantLock支持可重入锁,而CountDownLatch不支持可重入锁。
使用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()方法来等待所有线程执行完毕。