Java中的線程池如何實(shí)現(xiàn)線程復(fù)用
Java線程池實(shí)現(xiàn)線程復(fù)用
閑來沒事突然想到這個問題,便百度了下想查看具體實(shí)現(xiàn),無果。
便自己翻看了下源碼
以下是分析過程
眾所周知,Java內(nèi)部自帶了個線程池實(shí)現(xiàn) ExecutorService (雖然一直被人看不起)。
隨便找到其中的一個靜態(tài)方法
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
可知 ExecutorService 也只是一個封裝,真正的實(shí)現(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 實(shí)例最終經(jīng)過一系列安全檢驗(yàn)被傳入 addWorker 方法中
繼續(xù)追蹤可以看到實(shí)例(firstTask) 被傳入 `ThreadPoolLocal#Worker#init` 的有參構(gòu)造器中
而該 Worker 實(shí)例被添加進(jìn)名為 workers 的哈希表中
終于是找到正主了!
讓我們看看這個 Worker 到底是何方神圣,究竟是如何實(shí)現(xiàn)線程復(fù)用!
private final class Worker extends AbstractQueuedSynchronizer implements Runnable { public void run() { runWorker(this); } }
好家伙,原來 Worker 也實(shí)現(xiàn)了 Runnable,查看 runWorker 方法可知,當(dāng)當(dāng)前任務(wù)執(zhí)行后task置空,Worker 線程調(diào)用 getTask 方法從任務(wù)隊(duì)列中獲取新任務(wù)并執(zhí)行。
至此便實(shí)現(xiàn)了一個 Worker 線程執(zhí)行多個 Runnable 任務(wù)的功能。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java多線程實(shí)現(xiàn)服務(wù)器端與多客戶端之間的通信
本篇文章主要介紹了java多線程實(shí)現(xiàn)服務(wù)器端與多客戶端之間的通信,介紹了多線程來實(shí)現(xiàn)服務(wù)器與多線程之間的通信的基本步驟,有需要的小伙伴可以參考下。2016-10-10Java guava monitor監(jiān)視器線程的使用詳解
工作中的場景中是否存在類似這樣的場景,需要提交的線程在某個觸發(fā)條件下執(zhí)行。本文主要就是使用guava中的monitor來優(yōu)雅的實(shí)現(xiàn)帶監(jiān)視器的線程2021-11-11SpringMVC實(shí)現(xiàn)注解式權(quán)限驗(yàn)證的實(shí)例
本篇文章主要介紹了SpringMVC實(shí)現(xiàn)注解式權(quán)限驗(yàn)證的實(shí)例,可以使用Spring MVC中的action攔截器來實(shí)現(xiàn),具有一定的參考價(jià)值,有興趣的可以了解下。2017-02-02Spring Security如何使用URL地址進(jìn)行權(quán)限控制
這篇文章主要介紹了Spring Security如何使用URL地址進(jìn)行權(quán)限控制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Java生成的隨機(jī)數(shù)靠譜嗎?多少次會重復(fù)?
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java生成的隨機(jī)數(shù)靠不靠譜展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06StringUtils,CollectionUtils判斷為空的方法和原生代碼哪個效率最高
這篇文章主要介紹了StringUtils,CollectionUtils判斷為空的方法和原生代碼哪個效率最高,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02JavaWeb文件上傳下載實(shí)例講解(酷炫的文件上傳技術(shù))
在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳功能是非常常用的功能,今天來主要講講JavaWeb中的文件上傳功能的相關(guān)技術(shù)實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-11-11