併發程式設計之 執行緒池

2021-09-27 02:42:28 字數 3156 閱讀 7543

執行緒池做的工作主要是控制執行的執行緒的數量,處理過程中將任務放入佇列,然後再執行緒建立後啟動這些任務,如果執行緒數量超過了最大數量,超出數量的執行緒排隊等候,等其它執行緒執行完畢,再從佇列中取出任務來執行。

他的主要特點為:執行緒復用、控制最大併發數,管理執行緒。

第一:降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。

第二:提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。

第三:提高執行緒的可管理性。執行緒是稀缺資源,如果無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一的分配,調優和監控。

1、newcachedthreadpool

作用:建立乙個可根據需要建立新執行緒的執行緒池,但是在以前構造的執行緒可用時將重用它們,並在需要時使用提供的 threadfactory 建立新執行緒。

特徵:(1)執行緒池中數量沒有固定,可達到最大值(interger. max_value)

(2)執行緒池中的執行緒可進行快取重複利用和**(**預設時間為1分鐘)

(3)當執行緒池中,沒有可用執行緒,會重新建立乙個執行緒

建立方式: executors.newcachedthreadpool();

2、newfixedthreadpool

作用:建立乙個可重用固定執行緒數的執行緒池,以共享的無界佇列方式來執行這些執行緒。在任意點,在大多數 nthreads 執行緒會處於處理任務的活動狀態。如果在所有執行緒處於活動狀態時提交附加任務,則在有可用執行緒之前,附加任務將在佇列中等待。如果在關閉前的執行期間由於失敗而導致任何執行緒終止,那麼乙個新執行緒將代替它執行後續的任務(如果需要)。在某個執行緒被顯式地關閉之前,池中的執行緒將一直存在。

特徵:(1)執行緒池中的執行緒處於一定的量,可以很好的控制線程的併發量

(2)執行緒可以重複被使用,在顯示關閉之前,都將一直存在

(3)超出一定量的執行緒被提交時候需在佇列中等待

建立方式:

(1)executors.newfixedthreadpool(int nthreads);//nthreads為執行緒的數量

(2)executors.newfixedthreadpool(int nthreads,threadfactory threadfactory);//nthreads為執行緒的數量,threadfactory建立執行緒的工廠方式

3、newsinglethreadexecutor

作用:建立乙個使用單個 worker 執行緒的 executor,以無界佇列方式來執行該執行緒。(注意,如果因為在關閉前的執行期間出現失敗而終止了此單個執行緒,那麼如果需要,乙個新執行緒將代替它執行後續的任務)。可保證順序地執行各個任務,並且在任意給定的時間不會有多個執行緒是活動的。與其他等效的 newfixedthreadpool(1) 不同,可保證無需重新配置此方法所返回的執行程式即可使用其他的執行緒。

特徵:(1)執行緒池中最多執行1個執行緒,之後提交的執行緒活動將會排在佇列中以此執行

建立方式:

(1)executors.newsinglethreadexecutor() ;

(2)executors.newsinglethreadexecutor(threadfactory threadfactory);// threadfactory建立執行緒的工廠方式

4、newschedulethreadpool

作用: 建立乙個執行緒池,它可安排在給定延遲後執行命令或者定期地執行。

特徵:(1)執行緒池中具有指定數量的執行緒,即便是空執行緒也將保留

(2)可定時或者延遲執行執行緒活動

建立方式:

(1)executors.newscheduledthreadpool(int corepoolsize);// corepoolsize執行緒的個數

(2)newscheduledthreadpool(int corepoolsize, threadfactory threadfactory);// corepoolsize執行緒的個數,threadfactory建立執行緒的工廠

5、newsinglethreadscheduledexecutor

作用: 建立乙個單執行緒執行程式,它可安排在給定延遲後執行命令或者定期地執行。

特徵:(1)執行緒池中最多執行1個執行緒,之後提交的執行緒活動將會排在佇列中以此執行

(2)可定時或者延遲執行執行緒活動

建立方式:

(1)executors.newsinglethreadscheduledexecutor() ;

(2)executors.newsinglethreadscheduledexecutor(threadfactory threadfactory) ;//threadfactory建立執行緒的工廠

常用的三種 如下:

執行緒池按一下行為執行任務

當執行緒數小於核心執行緒數是,直接在核心執行緒池corepool建立執行緒。

當執行緒數大於等於核心執行緒數,且任務佇列未滿時,將任務放入任務佇列。

當執行緒數大於核心執行緒數,且任務佇列已滿。

1.若執行緒數小於最大執行緒數,在maxmumpool建立執行緒。

2.若執行緒數等於最大執行緒數,根據拒絕策略進行相應的處理。

當執行緒池的任務快取佇列已滿並且執行緒池中的執行緒數目達到maximumpoolsize,如果還有任務到來就會採取任務拒絕策略,通常有以下四種策略:

threadpoolexecutor.abortpolicy:丟棄任務並丟擲rejectedexecutionexception異常。

threadpoolexecutor.discardpolicy:也是丟棄任務,但是不丟擲異常。

threadpoolexecutor.discardoldestpolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)

threadpoolexecutor.callerrunspolicy:由呼叫執行緒處理該任務

併發程式設計之執行緒池

步驟1 自定義拒絕策略介面 1 執行緒池狀態 threadpoolexecutor使用int的高3位來表示執行緒池狀態,低29位表示執行緒數量 從數字上比較,terminated tidying stop shutdown running 這些資訊儲存在乙個原子變數ctl中目的是將執行緒池狀態與執行...

併發程式設計之執行緒池,程序池

池 受限於硬體的發展,硬體跟不上軟體的發展 在保證計算機硬體安全的情況下,最大限度的利用了計算機 池其實是降低了程式的執行效率,但是保證了計算機硬體的安全 我們再使用程序和執行緒時,不可能無限制的去開程序或執行緒。因此我們需要用到程序池,執行緒池來解決這一問題。1.concurrent模組是用來建立...

Java併發程式設計之執行緒池的使用(一)

為什麼使用執行緒池呢?在單執行緒的情況下,只有處理完乙個請求之後,才會去處理下乙個請求,但是在一些io操作阻塞的過程中,cpu是空閒的狀態,這個時候單執行緒不可能去利用cpu去處理其他請求,但是多執行緒就可以實現。但是使用多執行緒的時候,並且每個執行緒都是執行乙個時間很短的任務就結束了,這樣頻繁建立...