在 Java 中,ExecutorService 本身只是线程池,真正获取“执行结果”通常有两种方式,取决于你提交的任务类型。
submit() + Future 获取结果(最常用)Callable(有返回值)ExecutorService executor = Executors.newFixedThreadPool(2);
Callable<Integer> task = () -> {
Thread.sleep(1000);
return 1 + 1;
};
Future<Integer> future = executor.submit(task);
// 获取结果(会阻塞)
Integer result = future.get();
System.out.println(result); // 2
executor.shutdown();
✅ 特点:
Callable 有返回值Future.get() 会阻塞线程直到任务完成ExecutionException)Runnable(无返回值,但可带结果)ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future =
executor.submit(() -> {
System.out.println("run");
}, "done");
String result = future.get();
System.out.println(result); // done
invokeAll() / invokeAny()invokeAll(等待所有任务完成)List<Callable<Integer>> tasks = List.of(
() -> 1,
() -> 2
);
List<Future<Integer>> futures = executor.invokeAll(tasks);
for (Future<Integer> f : futures) {
System.out.println(f.get());
}
invokeAny(只要一个完成就返回)Integer result = executor.invokeAny(tasks);
System.out.println(result);
✅ 适合“竞速”场景
CompletableFuture(推荐,更现代)ExecutorService executor = Executors.newFixedThreadPool(2);
CompletableFuture<Integer> future =
CompletableFuture.supplyAsync(() -> 1 + 1, executor);
future.thenAccept(System.out::println);
✅ 优点:
try {
future.get();
} catch (ExecutionException e) {
Throwable cause = e.getCause();
cause.printStackTrace();
}
| 问题 | 说明 |
|---|---|
future.get() 阻塞 |
可用 get(timeout, unit) |
不 shutdown() |
线程池不会退出 |
| 异常被吞 | Runnable 异常不会抛出 |
| 场景 | 推荐方式 |
|---|---|
| 单任务有结果 | submit(Callable) |
| 多任务全部结果 | invokeAll |
| 异步非阻塞 | CompletableFuture |
| 只关心最快结果 | invokeAny |
如果你有具体业务场景(如超时控制、批量处理、Web 请求),我可以给你更合适的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。