執行緒池一些知識解答

2021-10-08 23:49:49 字數 1899 閱讀 1359

執行緒的建立和銷毀,維護乙個執行緒池處理多工,更加有效利用cpu。那麼主要是浪費那些資源呢?我們來分析建立乙個執行緒的過程

上面已經提到了,建立乙個執行緒還要呼叫作業系統核心api。為了更好的理解建立並啟動乙個執行緒的開銷,我們需要看看 jvm 在背後幫我們做了哪些事情:

這段描述稍稍有點抽象,用資料來說明建立乙個執行緒(即便不幹什麼)需要多大空間呢?答案是大約 1m 左右。如果每個使用者請求都新建執行緒的話,1024個執行緒就占用了1個g的記憶體,看來不對執行緒進行管理隱患很大,於是提出了執行緒池的概念。

一般我們都會用executors來建立執行緒,這是乙個執行緒池工廠類,呼叫各類方法可以獲得相應的執行緒池。執行緒池基本都是利用threadpoolexecutor類來建立的,類似executors.newfixedthreadpool的內部實現**:

return new threadpoolexecutor(nthreads, nthreads,

0l, timeunit.milliseconds,

new linkedblockingqueue()); # 佇列大小是 integer.max_value

我們根據入參順序來刨解:

通過引數來理解執行緒池的大致流程:

阿里巴巴開發手冊上:【強制】執行緒池不允許使用 executors 去建立,而是通過 threadpoolexecutor 的方式,這樣的處理方式讓寫的同學更加明確執行緒池的執行規則,規避資源耗盡的風險。

因為它們或多或少的有一些問題,很容易在實際生產中引發事故,我們應該了解他們的缺點,分別來對應使用在不同的場景中,特別是自己手動建立執行緒池,我們應該了解這些引數該如何設定。

拒絕策略:

其實開啟乙個執行緒後,再執行緒的run 方法中 寫乙個迴圈,執行乙個任務後就從佇列中獲取任務物件worker,worker物件是執行緒池定義的物件,乙個worker物件中都有乙個執行緒,任務worker的個數就表明執行緒的個數,不過**裡沒有利用worker集合的大小來做判斷,而是利用了atomicinteger物件來控制線程數量。同時為了保證避免執行緒的銷毀,執行緒池穩定執行之後一般都會保證corepoolsize大小的執行緒是活躍的,不會主動銷毀。

主要是執行緒池要保證一定的執行緒活躍,所以不能全部銷毀執行緒,避免頻繁的建立和銷毀,如果認為執行緒池執行緒一直不銷毀占用系統字段,其實可以通過corepoolsize的大小來控制活躍的執行緒數量。

利用阻塞佇列來實現,**如下:

private runnable gettask() 

int wc = workercountof(c);

// are workers subject to culling?

boolean timed = allowcorethreadtimeout || wc > corepoolsize;

if ((wc > maximumpoolsize || (timed && timedout))

&& (wc > 1 || workqueue.isempty()))

try catch (interruptedexception retry)

}}

workqueue.poll(keepalivetime, timeunit.nanoseconds) ; 這裡面keepalivetime 是阻塞佇列等待的時間,如果超過這個時間還沒有任務,就返回null,這樣work物件就執行結束了,執行緒就執行結束,自動就銷毀掉了。呼叫關係:

runworker()  - - >  gettask()
在超出核心執行緒數目後,就不再起執行緒,而是通過新增到阻塞佇列裡,暫緩任務,等有空閒執行緒再拉取任務。

執行緒池位運算

手撕threadpoolexecutor執行緒池原始碼

為什麼都說執行緒切換開銷小於程序呢?

【搞定面試官】你還在用executors來建立執行緒池?會有什麼問題呢?

對Tomcat執行緒池的一些理解

1.工作機制 tomcat啟動時如果沒有請求過來,那麼執行緒數 都是指執行緒池的 為0 一旦有請求,tomcat會初始化minsaprethreads設定的執行緒數 2.執行緒池作用 tomcat的執行緒池的執行緒數跟你的瞬間併發有關係,比如maxthreads設定為1000,當瞬間併發達到1000...

python程序池加執行緒池的一些問題

使用程序池加多執行緒的情況可以合理利用cpu,但是 會有些問題 from multiprocessing import pool import threading import requests def test1 s requests.session 使用連線池訪問,共用io復用 for i in...

程序與執行緒的一些知識

介紹程序 執行緒的概念 多程序和多執行緒的區別 python中對多程序和多執行緒的不同的實現方式。一 程序 程序簡單地說是乙個程式在計算機系統中執行的乙個過程,是作業系統資源分配的基本單位,從更深的層面講,是作業系統的一種抽象。如你在電腦上執行了qq這個軟體,這就是乙個程序。二 執行緒 然而,乙個程...