一、execute(Runnable task)
功能
- 提交不需要返回值的任务:用于执行
Runnable
任务。 - 无返回值:返回类型为
void
,无法直接获取任务执行结果。
示例
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.execute(() -> {
System.out.println("Task executed by execute()");
});
特点
- 异常处理:如果任务抛出异常,默认会通过线程池的
UncaughtExceptionHandler
处理。 - 适用场景:简单异步执行,无需关心任务结果或异常。
二、submit(Runnable/Callable)
功能
- 提交需要返回值的任务:支持
Runnable
和 Callable
任务。 - 返回
Future
对象:通过 Future
可以获取任务结果或检查任务状态。
重载形式
Future<?> submit(Runnable task);
<T> Future<T> submit(Runnable task, T result);
<T> Future<T> submit(Callable<T> task);
示例
Future<String> future = executor.submit(() -> {
return "Result from Callable";
});
String result = future.get();
特点
- 异常处理:任务中的异常会被封装在
Future
中,调用 Future.get()
时抛出 ExecutionException
。 - 适用场景:需要获取任务结果或捕获任务异常。
三、invokeAll(Collection<Callable<T>)
功能
- 批量提交多个任务:接受一个
Callable
任务集合。 - 阻塞等待所有任务完成:返回所有任务的
Future
列表。 - 全部完成或超时:支持超时控制(重载方法)。
示例
List<Callable<String>> tasks = Arrays.asList(
() -> "Task1",
() -> "Task2"
);
List<Future<String>> futures = executor.invokeAll(tasks);
for (Future<String> future : futures) {
System.out.println(future.get());
}
特点
- 结果顺序:返回的
Future
列表顺序与任务提交顺序一致。 - 异常处理:部分任务失败不会终止其他任务,需遍历
Future
处理异常。 - 适用场景:并行执行多个任务并汇总结果。
四、invokeAny(Collection<Callable<T>)
功能
- 批量提交多个任务:接受一个
Callable
任务集合。 - 返回首个成功任务的结果:任意一个任务成功完成(未抛出异常),立即返回其结果,并取消其他任务。
- 全部失败抛出异常:所有任务均失败时抛出
ExecutionException
。
示例
List<Callable<String>> tasks = Arrays.asList(
() -> { throw new RuntimeException("Task1 failed"); },
() -> "Task2 succeeded"
);
String result = executor.invokeAny(tasks);
特点
- 快速失败:适合冗余任务(如多个服务调用,取最快成功结果)。
- 适用场景:高可用场景,需要快速获取一个可用结果。
七、示例
public class ThreadPoolMethodsDemo {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.execute(() -> System.out.println("execute() task"));
Future<String> future = executor.submit(() -> "submit() result");
System.out.println(future.get());
List<Callable<String>> tasks = List.of(
() -> "invokeAll() task1",
() -> "invokeAll() task2"
);
List<Future<String>> futures = executor.invokeAll(tasks);
for (Future<String> f : futures) {
System.out.println(f.get());
}
String result = executor.invokeAny(tasks);
System.out.println("invokeAny() result: " + result);
executor.shutdown();
}
}