Java并发编程之ThreadPool提交方法

一、execute(Runnable task)

功能
  • 提交不需要返回值的任务:用于执行 Runnable 任务。
  • 无返回值:返回类型为 void,无法直接获取任务执行结果。
示例
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.execute(() -> {
    System.out.println("Task executed by execute()");
});
特点
  • 异常处理:如果任务抛出异常,默认会通过线程池的 UncaughtExceptionHandler 处理。
  • 适用场景:简单异步执行,无需关心任务结果或异常。

二、submit(Runnable/Callable)

功能
  • 提交需要返回值的任务:支持 RunnableCallable 任务。
  • 返回 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); // 返回 "Task2 succeeded"
特点
  • 快速失败:适合冗余任务(如多个服务调用,取最快成功结果)。
  • 适用场景:高可用场景,需要快速获取一个可用结果。

七、示例

public class ThreadPoolMethodsDemo {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newFixedThreadPool(4);

        // 1. execute()
        executor.execute(() -> System.out.println("execute() task"));

        // 2. submit()
        Future<String> future = executor.submit(() -> "submit() result");
        System.out.println(future.get());

        // 3. invokeAll()
        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());
        }

        // 4. invokeAny()
        String result = executor.invokeAny(tasks);
        System.out.println("invokeAny() result: " + result);

        executor.shutdown();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值