Java中的線程池如何實現(xiàn)線程復(fù)用
Java線程池實現(xiàn)線程復(fù)用
閑來沒事突然想到這個問題,便百度了下想查看具體實現(xiàn),無果。
便自己翻看了下源碼
以下是分析過程
眾所周知,Java內(nèi)部自帶了個線程池實現(xiàn) ExecutorService (雖然一直被人看不起)。
隨便找到其中的一個靜態(tài)方法
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}可知 ExecutorService 也只是一個封裝,真正的實現(xiàn)還得看 ThreadPoolExecutor。
根據(jù)推斷我們可以首先從 `ThreadPoolExecutor#execute` 找起
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false))
reject(command);
}讀題解
傳入的 Runnable 實例最終經(jīng)過一系列安全檢驗被傳入 addWorker 方法中
繼續(xù)追蹤可以看到實例(firstTask) 被傳入 `ThreadPoolLocal#Worker#init` 的有參構(gòu)造器中
而該 Worker 實例被添加進名為 workers 的哈希表中

終于是找到正主了!
讓我們看看這個 Worker 到底是何方神圣,究竟是如何實現(xiàn)線程復(fù)用!
private final class Worker extends AbstractQueuedSynchronizer implements Runnable {
public void run() {
runWorker(this);
}
}好家伙,原來 Worker 也實現(xiàn)了 Runnable,查看 runWorker 方法可知,當(dāng)當(dāng)前任務(wù)執(zhí)行后task置空,Worker 線程調(diào)用 getTask 方法從任務(wù)隊列中獲取新任務(wù)并執(zhí)行。
至此便實現(xiàn)了一個 Worker 線程執(zhí)行多個 Runnable 任務(wù)的功能。

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解如何在SpringBoot控制器中處理用戶數(shù)據(jù)
在 Spring Boot 應(yīng)用開發(fā)中,控制器(Controller)扮演著至關(guān)重要的角色,它負(fù)責(zé)接收用戶請求、處理數(shù)據(jù)并返回響應(yīng),本文將深入淺出地講解如何在 Spring Boot 控制器中處理用戶數(shù)據(jù),包括獲取請求參數(shù)、處理表單提交、返回 JSON 數(shù)據(jù)等常見場景,需要的朋友可以參考下2025-05-05
MybatisPlus中removeById刪除數(shù)據(jù)庫未變解決方案
MyBatisPlus中,removeById需實體類標(biāo)注@TableId注解以識別數(shù)據(jù)庫主鍵,若字段名不一致,應(yīng)通過value屬性指定表主鍵字段名,確保正確映射2025-08-08
深入理解springMVC中的Model和Session屬性
這篇文章主要介紹了深入理解springMVC中的Model和Session屬性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java Yml格式轉(zhuǎn)換為Properties問題
本文介紹了作者編寫一個Java工具類來解決在線YAML到Properties轉(zhuǎn)換時屬性內(nèi)容遺漏的問題,通過遍歷YAML文件的樹結(jié)構(gòu),作者成功實現(xiàn)了屬性的完整轉(zhuǎn)換,總結(jié)指出,該工具類適用于多種數(shù)據(jù)類型,并且代碼簡潔易懂2024-12-12
在Action中以Struts2的方式輸出JSON數(shù)據(jù)的實例
下面小編就為大家?guī)硪黄贏ction中以Struts2的方式輸出JSON數(shù)據(jù)的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
Java多態(tài)在Spring Boot 3中的實際應(yīng)用實例教程
本文詳細(xì)介紹了多態(tài)在SpringBoot中的應(yīng)用,通過實際應(yīng)用場景和設(shè)計模式的深度解析,展示了多態(tài)在構(gòu)建松耦合、高內(nèi)聚軟件架構(gòu)中的重要性,并提供了性能優(yōu)化和最佳實踐建議,感興趣的朋友跟隨小編一起看看吧2026-02-02
jdk8?FunctionalInterface注解源碼解讀
這篇文章主要介紹了jdk8?FunctionalInterface注解源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11

