在 Java 中,ExecutorService 提供了多种提交任务的方式,最常用的是 execute 和 submit。下面按常见用法系统说明,并给出示例。
先创建一个线程池(常见方式):
ExecutorService executor = Executors.newFixedThreadPool(3);
或(推荐,更可控):
ExecutorService executor = new ThreadPoolExecutor(
3,
5,
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(10)
);
execute(Runnable) —— 无返回结果特点
Runnableexecutor.execute(() -> {
System.out.println("任务执行中");
});
✅ 适合:不需要返回结果的任务
submit(Runnable) —— 返回 FutureFuture<?> future = executor.submit(() -> {
System.out.println("任务执行中");
});
Future<?>future.get() 返回 nullfuture.get(); // 会阻塞,直到任务完成
submit(Runnable, T result) —— 返回指定结果Future<String> future = executor.submit(() -> {
System.out.println("任务执行中");
}, "SUCCESS");
String result = future.get();
System.out.println(result); // SUCCESS
submit(Callable<T>) —— 有返回结果(最常用)特点
Callable<String> task = () -> {
Thread.sleep(1000);
return "任务结果";
};
Future<String> future = executor.submit(task);
String result = future.get(); // 阻塞等待结果
System.out.println(result);
execute vs submit 对比| 方式 | 是否有返回值 | 是否可捕获异常 | 适用场景 |
|---|---|---|---|
execute |
❌ | ❌ | 简单异步任务 |
submit |
✅ | ✅ | 需要结果或异常处理 |
invokeAllList<Callable<String>> tasks = List.of(
() -> "任务1",
() -> "任务2"
);
List<Future<String>> futures = executor.invokeAll(tasks);
for (Future<String> f : futures) {
System.out.println(f.get());
}
invokeAnyString result = executor.invokeAny(tasks);
System.out.println(result);
executor.shutdown(); // 不再接受新任务
或:
executor.shutdownNow(); // 尝试中断正在执行的任务
executor.submit(() -> {
throw new RuntimeException("error");
});
❗异常不会抛出,而是藏在 Future 里:
Future<?> f = executor.submit(...)
f.get(); // 这里才会抛异常
没有返回结果 →
execute
有返回结果 / 需要异常处理 →submit(Callable)
如果你需要,我也可以结合 CompletableFuture、Spring @Async 或 实际业务场景 给你更贴近实战的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。