欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的線程池如何實現(xiàn)線程復用

 更新時間:2024年03月27日 09:17:15   作者:IllTamer  
這篇文章主要介紹了Java中的線程池如何實現(xiàn)線程復用問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Java線程池實現(xiàn)線程復用

閑來沒事突然想到這個問題,便百度了下想查看具體實現(xiàn),無果。

便自己翻看了下源碼

以下是分析過程

眾所周知,Java內部自帶了個線程池實現(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` 的有參構造器中

而該 Worker 實例被添加進名為 workers 的哈希表中

終于是找到正主了!

讓我們看看這個 Worker 到底是何方神圣,究竟是如何實現(xiàn)線程復用!

private final class Worker extends AbstractQueuedSynchronizer implements Runnable {
    public void run() {
        runWorker(this);
    }
}

好家伙,原來 Worker 也實現(xiàn)了 Runnable,查看 runWorker 方法可知,當當前任務執(zhí)行后task置空,Worker 線程調用 getTask 方法從任務隊列中獲取新任務并執(zhí)行。

至此便實現(xiàn)了一個 Worker 線程執(zhí)行多個 Runnable 任務的功能。

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • JavaScript中的closest方法示例詳解

    JavaScript中的closest方法示例詳解

    這篇文章主要介紹了JavaScript中closest方法的相關資料,closest()是JavaScript中的一個非常實用的?DOM?方法,用于查找與當前元素匹配的最近的祖先元素,它支持?CSS?選擇器,可以應用于事件委托、動態(tài)內容處理等場景,需要的朋友可以參考下
    2025-02-02
  • java多線程實現(xiàn)服務器端與多客戶端之間的通信

    java多線程實現(xiàn)服務器端與多客戶端之間的通信

    本篇文章主要介紹了java多線程實現(xiàn)服務器端與多客戶端之間的通信,介紹了多線程來實現(xiàn)服務器與多線程之間的通信的基本步驟,有需要的小伙伴可以參考下。
    2016-10-10
  • Java guava monitor監(jiān)視器線程的使用詳解

    Java guava monitor監(jiān)視器線程的使用詳解

    工作中的場景中是否存在類似這樣的場景,需要提交的線程在某個觸發(fā)條件下執(zhí)行。本文主要就是使用guava中的monitor來優(yōu)雅的實現(xiàn)帶監(jiān)視器的線程
    2021-11-11
  • spring項目中切面及AOP的使用方法

    spring項目中切面及AOP的使用方法

    我們知道,spring兩大核心,IOC(控制反轉)和AOP(切面),那為什么要使用AOP,AOP是什么呢?帶著這些問題通過本文學習下吧
    2021-06-06
  • Java如何實現(xiàn)圖像的卷積效果

    Java如何實現(xiàn)圖像的卷積效果

    這篇文章主要介紹了Java如何實現(xiàn)圖像的卷積效果問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • SpringMVC實現(xiàn)注解式權限驗證的實例

    SpringMVC實現(xiàn)注解式權限驗證的實例

    本篇文章主要介紹了SpringMVC實現(xiàn)注解式權限驗證的實例,可以使用Spring MVC中的action攔截器來實現(xiàn),具有一定的參考價值,有興趣的可以了解下。
    2017-02-02
  • Spring Security如何使用URL地址進行權限控制

    Spring Security如何使用URL地址進行權限控制

    這篇文章主要介紹了Spring Security如何使用URL地址進行權限控制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Java生成的隨機數(shù)靠譜嗎?多少次會重復?

    Java生成的隨機數(shù)靠譜嗎?多少次會重復?

    今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著Java生成的隨機數(shù)靠不靠譜展開,文中有非常詳細的介紹,需要的朋友可以參考下
    2021-06-06
  • StringUtils,CollectionUtils判斷為空的方法和原生代碼哪個效率最高

    StringUtils,CollectionUtils判斷為空的方法和原生代碼哪個效率最高

    這篇文章主要介紹了StringUtils,CollectionUtils判斷為空的方法和原生代碼哪個效率最高,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • JavaWeb文件上傳下載實例講解(酷炫的文件上傳技術)

    JavaWeb文件上傳下載實例講解(酷炫的文件上傳技術)

    在Web應用系統(tǒng)開發(fā)中,文件上傳功能是非常常用的功能,今天來主要講講JavaWeb中的文件上傳功能的相關技術實現(xiàn),本文給大家介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-11-11

最新評論