上面代码,如果多个异步线程,如何等待所有线程完成,
时间: 2023-12-01 17:04:55 浏览: 102
如果需要等待多个异步线程完成后再执行下一步操作,可以使用Java中的CountDownLatch类来实现。
CountDownLatch类是一个同步辅助类,它可以使一个或多个线程等待其他线程完成操作后再执行。具体使用步骤如下:
1. 创建CountDownLatch对象,将计数器初始化为需要等待的线程数。
2. 在每个异步线程完成操作后,调用CountDownLatch对象的countDown()方法,将计数器减1。
3. 在主线程中,调用CountDownLatch对象的await()方法,阻塞当前线程,直到计数器变为0。
下面是一个示例代码:
```java
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException {
int threadCount = 5;
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
for (int i = 0; i < threadCount; i++) {
executorService.execute(() -> {
// 模拟异步操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 执行完毕");
countDownLatch.countDown(); // 计数器减1
});
}
countDownLatch.await(); // 阻塞当前线程,直到计数器变为0
System.out.println("所有异步操作执行完毕");
executorService.shutdown();
}
}
```
在上面的示例代码中,创建了一个计数器为5的CountDownLatch对象,并使用线程池异步执行5个操作。在每个异步操作完成后,调用countDownLatch.countDown()方法将计数器减1。在主线程中,调用countDownLatch.await()方法阻塞当前线程,直到计数器变为0。当所有异步操作执行完毕后,打印出“所有异步操作执行完毕”。注意,在使用CountDownLatch类时,计数器的初始值应该设置为需要等待的线程数,而不是异步操作的个数。
阅读全文