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

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

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

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)文章

最新評論