threadPool.submit() 和 threadPool.execute()的区别
在 Java 中,threadPool.submit()
和 threadPool.execute()
都是用于向线程池提交任务的方法,但它们有 重要区别,主要体现在:
1. 返回值不同
方法 | 返回类型 | 是否能获取任务结果 |
---|---|---|
execute(Runnable) | void | ❌ 不能获取执行结果 |
submit(Runnable) | Future<?> | ✅ 可以获取/检查结果,或异常 |
🔹 举例说明:
threadPool.execute(() -> {// 执行任务,但不能拿到结果
});Future<?> future = threadPool.submit(() -> {// 执行任务
});
// 你可以通过 future.get() 获取结果(或异常)
2. 异常处理行为不同
execute()
中如果抛出异常,线程池不会抛出异常给调用者,可能会被吞掉,或者打印在日志中;submit()
会把异常封装进Future
对象中,你可以通过future.get()
获取异常信息。
🔹 举例:
threadPool.submit(() -> {throw new RuntimeException("Error");
}).get(); // 会抛出 ExecutionException(封装了原始异常)
3. submit 支持 Callable
,而 execute 不支持
Callable<String> task = () -> "Hello";
Future<String> future = threadPool.submit(task);
submit()
可以接受Callable<T>
,并返回Future<T>
,从而获取返回值。execute()
只能接受Runnable
,没有返回值。
4. 总结
特性 | execute() | submit() |
---|---|---|
返回值 | void | Future<?> |
能否拿到任务结果 | ❌ | ✅ |
是否支持 Callable | ❌ | ✅ |
异常处理 | 异常可能被吞 | 异常可通过 Future.get() 捕获 |
使用场景 | 只需执行任务 | 需要结果/异常处理 |
5. 用法
- 不关心任务结果或异常 → 用
execute()
- 需要任务返回值或处理异常 → 用
submit()