Java線程池execute()和submit()的對(duì)比詳解
execute() 和 submit() 都是線程池提交任務(wù)的核心方法,都屬于 ExecutorService 線程池接口,核心區(qū)別:execute() 無(wú)返回值、不處理異常;submit() 有返回值、會(huì)捕獲異常。
下面從核心定義、使用場(chǎng)景、返回值、異常處理、方法歸屬等維度做清晰對(duì)比,附實(shí)戰(zhàn)代碼。
一、核心區(qū)別速查表
| 對(duì)比項(xiàng) | execute() | submit() |
|---|---|---|
| 返回值 | void,無(wú)返回結(jié)果 | Future<T>,可獲取任務(wù)執(zhí)行結(jié)果/狀態(tài) |
| 異常處理 | 直接拋出異常(會(huì)終止線程,從線程池移除) | 自動(dòng)捕獲異常,需通過(guò) Future.get() 才拋出 |
| 任務(wù)類型 | 只能提交 Runnable 無(wú)返回值任務(wù) | 可提交 Runnable + Callable 有返回值任務(wù) |
| 使用場(chǎng)景 | 執(zhí)行不需要結(jié)果、不關(guān)心異常的異步任務(wù) | 執(zhí)行需要結(jié)果、需要捕獲異常的異步任務(wù) |
| 方法歸屬 | 定義在 Executor 頂層接口 | 定義在 ExecutorService 子接口 |
| 源碼設(shè)計(jì) | 最基礎(chǔ)的任務(wù)提交方法 | 基于 execute() 封裝,功能更強(qiáng) |
二、詳細(xì)解析
1. 返回值區(qū)別(最核心)
- execute():
void,提交后無(wú)法跟蹤任務(wù)是否執(zhí)行完成、無(wú)法獲取結(jié)果。 - submit():返回
Future對(duì)象,可通過(guò)它:- 判斷任務(wù)是否完成
- 取消任務(wù)
- 獲取任務(wù)執(zhí)行結(jié)果
- 獲取任務(wù)拋出的異常
2. 異常處理區(qū)別(關(guān)鍵坑點(diǎn))
- execute():任務(wù)拋出未捕獲異常時(shí),直接打印堆棧、終止線程,線程會(huì)從線程池被移除。
- submit():無(wú)論任務(wù)拋什么異常,都不會(huì)直接拋出,異常會(huì)被存起來(lái),只有調(diào)用
Future.get()時(shí)才會(huì)拋出。
3. 支持的任務(wù)類型區(qū)別
- execute():僅支持
Runnable(無(wú)返回值)。 - submit():支持兩種任務(wù):
Runnable(無(wú)返回值)Callable<T>(有返回值,能拋異常)
三、實(shí)戰(zhàn)代碼示例
1. execute() 使用
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecuteDemo {
public static void main(String[] args) {
ExecutorService pool = Executors.newSingleThreadExecutor();
// 提交無(wú)返回值任務(wù)
pool.execute(() -> {
System.out.println("execute 執(zhí)行任務(wù)");
// 異常會(huì)直接拋出,導(dǎo)致線程死亡
// int i = 1 / 0;
});
pool.shutdown();
}
}
? 適用:日志打印、消息發(fā)送、異步更新緩存等不需要結(jié)果、不關(guān)心異常的任務(wù)。
2. submit() 使用(獲取返回值)
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class SubmitDemo {
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newSingleThreadExecutor();
// 提交 Callable 任務(wù),有返回值
Future<Integer> future = pool.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println("submit 執(zhí)行任務(wù)");
return 1 + 1; // 返回結(jié)果
}
});
// 獲取任務(wù)結(jié)果(阻塞等待)
Integer result = future.get();
System.out.println("任務(wù)結(jié)果:" + result); // 輸出 2
pool.shutdown();
}
}
? 適用:異步計(jì)算、接口并行調(diào)用、需要獲取執(zhí)行結(jié)果/處理異常的任務(wù)。
3. submit() 異常處理演示
Future<Integer> future = pool.submit(() -> {
System.out.println("submit 任務(wù)");
int i = 1 / 0; // 拋異常
return 100;
});
// 異常不會(huì)直接拋出!
// 只有調(diào)用 get() 才會(huì)拋出 ExecutionException
try {
future.get();
} catch (Exception e) {
System.out.println("捕獲到異常:" + e.getCause());
}
四、底層原理(簡(jiǎn)單理解)
submit() 本質(zhì)是對(duì) execute() 的封裝:
- 把任務(wù)包裝成
FutureTask(同時(shí)實(shí)現(xiàn)Runnable + Future) - 調(diào)用
execute()提交 - 執(zhí)行結(jié)果/異常存入
FutureTask,通過(guò)get()獲取
五、如何選擇?
- 只用 execute():
任務(wù)不需要返回值、異常自己處理(try-catch)、不關(guān)心執(zhí)行狀態(tài)。 - 必須用 submit():
- 需要獲取任務(wù)結(jié)果
- 需要判斷任務(wù)是否完成/取消任務(wù)
- 需要統(tǒng)一捕獲任務(wù)異常
- 提交
Callable帶返回值的任務(wù)
總結(jié)
- execute():輕量、無(wú)返回、異常直接拋 → 適合簡(jiǎn)單異步執(zhí)行。
- submit():強(qiáng)大、有返回、可捕獲異常 → 適合需要結(jié)果/管控的任務(wù)。
- 日常開(kāi)發(fā):簡(jiǎn)單任務(wù)用 execute,復(fù)雜任務(wù)用 submit + Future。
以上就是Java線程池execute()和submit()的對(duì)比詳解的詳細(xì)內(nèi)容,更多關(guān)于Java線程池execute()和submit()對(duì)比的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決引用jip-common jar包,報(bào)401 Unauthorized錯(cuò)誤問(wèn)題
這篇文章主要介紹了解決引用jip-common jar包,報(bào)401 Unauthorized錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
在IDEA中創(chuàng)建跑得起來(lái)的Springboot項(xiàng)目
這篇文章主要介紹了在IDEA中創(chuàng)建跑得起來(lái)的Springboot項(xiàng)目的圖文教程,需要的朋友可以參考下2018-04-04
Spring Security OAuth2.0登出的實(shí)現(xiàn)
本文主要介紹了Spring Security OAuth2.0登出的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-03-03
Java使用Apache Batik實(shí)現(xiàn)將SVG轉(zhuǎn)換為PNG
在項(xiàng)目中經(jīng)常需要將 SVG 圖標(biāo)或圖形轉(zhuǎn)換為 PNG 格式,Apache Batik 是一個(gè)強(qiáng)大的 SVG 處理庫(kù),可以輕松實(shí)現(xiàn) SVG → PNG 的轉(zhuǎn)換,下面我們就來(lái)看看具體實(shí)現(xiàn)方法吧2026-01-01
Spring AI接入OpenAI超時(shí)報(bào)錯(cuò)401/429的原因和解決方案
本文提供了SpringAI接入OpenAI時(shí)常見(jiàn)的超時(shí)報(bào)錯(cuò)排查清單,并給出了完整解決代碼,主要了三個(gè)常見(jiàn)錯(cuò)誤:APIKey問(wèn)題、速率限制和超時(shí)問(wèn)題,還了詳細(xì)的解決步驟和驗(yàn)證方法,并強(qiáng)調(diào)生產(chǎn)環(huán)境要避免硬編碼APIKey、添加限流和重試機(jī)制,需要的朋友可以參考下2026-05-05
java按照模板導(dǎo)出pdf或word文件詳細(xì)代碼
有時(shí)候業(yè)務(wù)中我們需要使用pdf模板生成一份pdf文件,下面這篇文章主要給大家介紹了關(guān)于java按照模板導(dǎo)出pdf或word文件的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-11-11
Java滾動(dòng)數(shù)組計(jì)算編輯距離操作示例
這篇文章主要介紹了Java滾動(dòng)數(shù)組計(jì)算編輯距離操作,涉及java字符串與數(shù)組的遍歷、計(jì)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2019-12-12

