java实现线程池执行不确定数量的线程,保证所有子线程都执行完毕
时间: 2023-03-21 17:02:28 浏览: 273
可以通过以下步骤实现:
1. 创建一个线程池对象,可以使用Java提供的Executors类中的newFixedThreadPool方法创建一个固定大小的线程池。
2. 将所有要执行的任务放入一个任务队列中。
3. 使用一个循环来不断从任务队列中取出任务,将任务提交给线程池执行。
4. 当所有任务都被提交给线程池后,可以通过调用线程池的shutdown方法来关闭线程池,并等待所有线程执行完毕。
5. 在任务执行完成后,可以通过使用CountDownLatch来等待所有子线程都执行完毕。可以在主线程中创建一个CountDownLatch对象,并将其计数器初始化为要执行的子线程数。
6. 在每个子线程的run方法中,执行完任务后,可以通过调用CountDownLatch的countDown方法来减少计数器的值。
7. 在主线程中,可以调用CountDownLatch的await方法来等待计数器变为0,表示所有子线程都执行完毕。
示例代码如下:
```java
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolDemo {
public static void main(String[] args) throws InterruptedException {
// 创建一个固定大小的线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 创建一个计数器,用于等待所有子线程执行完成
CountDownLatch countDownLatch = new CountDownLatch(10);
// 将任务提交给线程池执行
for (int i = 0; i < 10; i++) {
executorService.execute(() -> {
// 子线程执行的任务
System.out.println(Thread.currentThread().getName() + "正在执行任务");
// 计数器减1
countDownLatch.countDown();
});
}
// 关闭线程池
executorService.shutdown();
// 等待所有子线程执行完成
countDownLatch.await();
// 所有子线程执行完毕后,执行主线程的任务
System.out.println("所有子线程执行完毕");
}
}
```
阅读全文