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()
