在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ Java線程池ThreadPoolExecutor中workers.remove

Java線程池ThreadPoolExecutor中workers.remove(w)疑惑

在查看Java線程池實(shí)現(xiàn)的源碼時(shí),對于線程池內(nèi)部worker生命周期有一個(gè)不解的地方:當(dāng)worker所持有的task,或者線程隊(duì)列中的task都被執(zhí)行完以后,為什么worker要被移除線程池的worker集合。

追蹤源碼的過程大致是:
查看execute(Runnable command)方法,發(fā)現(xiàn)了addWorker(command, true)的調(diào)用

        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);

進(jìn)入addWorker(Runnable firstTask, boolean core),發(fā)現(xiàn)了worker線程的啟動(dòng)

if (workerAdded) {
    t.start();
    workerStarted = true;
}

Worker類的run方法即調(diào)用ThreadPoolExecutor中的runWorker方法。
在runWorker方法的最后調(diào)用了processWorkerExit方法。

} finally {
    processWorkerExit(w, completedAbruptly);
}

在processWorkerExit中發(fā)現(xiàn):

        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            completedTaskCount += w.completedTasks;
            workers.remove(w);
        } finally {
            mainLock.unlock();
        }

worker被從線程集合workers移除了。

所以疑惑或者問題是:
線程持中其實(shí)是不保有一定數(shù)量可用線程,如果當(dāng)task隊(duì)列里面沒有要處理的任務(wù),原先創(chuàng)造的worker工作線程都會逐步被移除,直到下次再有新的task到來,才又會創(chuàng)建新的worker工作線程??

回答
編輯回答
互擼娃

圖片描述
題主可以點(diǎn)進(jìn)去getTask方法里面看下,runWorker的while循環(huán)提交里面
1.timedOut[1040], 首次獲取任務(wù)是否可以超時(shí), 默認(rèn)false
2.[1043-1050], 檢查線程池狀態(tài), 如果處于關(guān)閉狀態(tài)則返回null。根據(jù)代碼,會關(guān)閉所有線程
3.timed ,允許超時(shí)?[1055], 是否允許核心線程超時(shí) || 當(dāng)前活動(dòng)線程是否大于核心線程
4.[1057-1062]。 分成兩段,同時(shí)為真才會執(zhí)行[1059]-[1061]

   4.1 當(dāng)前活動(dòng)線程是否大于maximumPoolSize || 允許超時(shí)
   4.2 活動(dòng)線程大于 1 條 || 任務(wù)隊(duì)列為空的

5.[1065-1070]根據(jù)timed參數(shù), 是有永久阻塞獲取任務(wù)

簡單的來說就是,線程池會維持corePoolSize條線程存活持續(xù)等待任務(wù)。當(dāng)任務(wù)隊(duì)列滿了,但活躍線程數(shù)小于maximumPoolSize,線程池就會去創(chuàng)建額外的線程去執(zhí)行任務(wù)。當(dāng)任務(wù)隊(duì)列空了,線程池只會保留corePoolSize條線程,額外線程就會被殺死

圖片的源代碼是jdk1.8, 我說的可能比較粗糙。題主可以去看下這篇文章

2017年10月9日 05:42
編輯回答
別瞎鬧

沒有task時(shí)候,worker會堵塞在blockingqueue的take的 ,并不會執(zhí)行下面的方法 那個(gè)只有pool的statue處于stop或terminated時(shí)候色處理操作

2017年9月19日 14:55
編輯回答
祉小皓

線程池會自己先建立指定的數(shù)量,當(dāng)使用的時(shí)候調(diào)用其中的線程,當(dāng)線程超過指定的數(shù)據(jù)時(shí),會創(chuàng)建額外的線程,使用完了后,一定時(shí)候沒有使用,會回收,回收完后,當(dāng)回收到線程池中剩下指定的數(shù)量后,不再回收,額外的線程會被回收。

2017年12月2日 03:45