ThreadPoolTaskExecutor
是 Java 中的一个线程池执行器,它允许你并发执行多个任务。在某些情况下,你可能需要等待所有任务完成,以确保在继续执行程序的其余部分之前,所有的任务都已正确执行。
在 Java 中,可以使用 ExecutorService
接口的 invokeAll
方法来实现阻塞等待所有任务完成。以下是一个简单的例子,展示了如何使用 ThreadPoolTaskExecutor
来执行多个任务,并阻塞等待所有任务的结果返回:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建一个线程池
ExecutorService executorService = Executors.newFixedThreadPool(3);
// 创建一个任务列表
List<Callable<String>> tasks = new ArrayList<>();
for (int i = 0; i < 5; i++) {
tasks.add(() -> {
// 模拟任务执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Task " + i + " completed";
});
}
// 执行所有任务并等待它们完成
List<Future<String>> futures = executorService.invokeAll(tasks);
// 关闭线程池
executorService.shutdown();
// 遍历所有任务的结果
for (Future<String> future : futures) {
try {
// 获取任务结果
String result = future.get();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
在这个例子中,我们首先创建了一个固定大小的线程池 ExecutorService
。然后,我们创建了一个 Callable
任务列表,每个任务都模拟了一个耗时的操作。使用 invokeAll
方法,我们提交了所有任务并等待它们完成。一旦所有任务都完成了,我们遍历了 Future
对象列表来获取每个任务的结果。
请注意,invokeAll
方法会阻塞当前线程,直到所有任务完成或者发生异常。如果你只想等待任务完成而不关心任务的返回值,可以使用 shutdown
方法来关闭线程池,然后使用 awaitTermination
方法来等待所有任务完成。
executorService.shutdown();
try {
if (!executorService.awaitTermination(1, TimeUnit.MINUTES)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
}
这段代码尝试在指定的时间内等待线程池关闭,如果超时,则尝试立即关闭线程池。