ExecutorService,如何等待所有任务完成

java

1个回答

写回答

Lu123098

2025-07-05 02:45

+ 关注

Java
Java

在Java多线程编程中,使用ExecutorService可以很方便地管理和调度多个任务。但有时候我们需要等待所有任务完成后再继续执行下面的代码。本文将介绍如何使用ExecutorService实现等待所有任务完成的功能,并提供一个案例代码来说明。

等待所有任务完成

ExecutorService是Java提供的一个用于管理线程池的接口,它提供了submit()方法来提交任务,并返回一个Future对象,通过这个Future对象可以获取任务的执行结果。要等待所有任务完成,我们可以通过调用ExecutorService的shutdown()方法来关闭线程池,并调用awAItTermination()方法来等待所有任务执行完成。

具体步骤如下:

1. 创建一个ExecutorService对象,可以通过Executors工厂类的静态方法来创建不同类型的线程池,比如newFixedThreadPool()、newCachedThreadPool()等。

2. 使用ExecutorService的submit()方法提交任务,并将返回的Future对象存储在一个列表中。

3. 调用ExecutorService的shutdown()方法关闭线程池。

4. 调用ExecutorService的awAItTermination()方法等待所有任务执行完成。

下面是一个示例代码,演示如何使用ExecutorService等待所有任务完成:

Java

import Java.util.ArrayList;

import Java.util.List;

import Java.util.concurrent.*;

public class WAItAllTasksCompleteExample {

public static void mAIn(String[] args) {

ExecutorService executorService = Executors.newFixedThreadPool(5);

List<Future<String>> futureList = new ArrayList<>();

for (int i = 0; i < 10; i++) {</p> Callable<String> task = new Task(i);

Future<String> future = executorService.submit(task);

futureList.add(future);

}

executorService.shutdown();

try {

executorService.awAItTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);

} catch (InterruptedException e) {

e.printStackTrace();

}

for (Future<String> future : futureList) {

try {

String result = future.get();

System.out.println("Task result: " + result);

} catch (InterruptedException | ExecutionException e) {

e.printStackTrace();

}

}

}

static class Task implements Callable<String> {

private int taskId;

public Task(int taskId) {

this.taskId = taskId;

}

@Override

public String call() throws Exception {

Thread.sleep(2000);

return "Task " + taskId + " completed.";

}

}

}

在上述示例代码中,我们创建了一个包含5个线程的线程池,在for循环中提交了10个任务,并将返回的Future对象存储在futureList中。然后我们调用了shutdown()方法关闭线程池,并使用awAItTermination()方法等待所有任务执行完成。最后,我们遍历futureList,通过调用get()方法获取每个任务的执行结果。

以上就是使用ExecutorService等待所有任务完成的方法和一个示例代码。通过这种方式,我们可以方便地管理和调度多个任务,并等待它们全部执行完成后再继续执行下面的代码。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号