原來你是這樣的執行緒池

2021-10-24 09:53:49 字數 1953 閱讀 9526

我們知道,建立執行緒有四種方式

那麼,什麼是執行緒池?

簡單理解,執行緒池就是將執行緒提前建立好的乙個池子,需要的時候就取出使用,不在使用就歸還給執行緒池。

執行緒池有什麼作用?我們建立、銷毀執行緒,都要消耗特別大的資源,併發情況下,對於效能影響很大。使用執行緒池,能夠提高響應速度。降低資源消耗,便於執行緒的管理。

如何建立?

1.通過官方提供的api建立

executorservice threadpoll1 = executors.

newfixedthreadpool(10

);//建立固定大小的執行緒池,這裡建立了最大建立10個執行緒的執行緒池

executorservice threadpoll2 = executors.

newsinglethreadexecutor()

;//建立乙個單例的執行緒的執行緒池

executorservice threadpoll3 = executors.

newcachedthreadpool()

;//建立乙個可擴充套件執行緒數的獲得執行緒數

說明:雖然官網提供了這三種執行緒池的建立方式,但是開發中不用,因為alibaba開發手冊中說明了原因。

那麼只有自定義執行緒池了,如何建立呢?

2.自定義執行緒池

要想自定義執行緒池,我們需要知道執行緒池的7個重要引數。

executorservice threadpool =

newthreadpoolexecutor(2

,5,2l,

timeunit.seconds,

newlinkedblockingqueue

<

>(3

),executors.

defaultthreadfactory()

,new

threadpoolexecutor.abortpolicy()

);說明:以上**中構造器的引數順序即為上面寫的順序。

表示建立乙個核心執行緒數為2、最大執行緒數為5,

非核心執行緒空閒時存活時間為2、時間單位為秒、阻塞佇列長度為3、

執行緒工廠為預設、拒絕策略(後面會提到)為中斷執行的執行緒池。

然後通過呼叫excute方法執行執行緒。

for

(int i =

1; i <=

10; i++))

;//這裡使用到了lambda表示式,不清楚的小夥伴可以學習一下簡介的lambda表示式。

}

上面建立了10個執行緒,而我們執行緒池最大提供的執行緒數為5,那麼會不會出現問題呢?

答案是有可能出現如下問題。

為什麼呢?

因為執行緒池提供的最大執行緒數為5,此時我們傳送了10個執行執行緒的請求,這5個執行緒加上等待佇列中的3個,小於10個請求數,此時執行緒池提供不了服務,就會出現拒絕異常。

要想不出現這種異常,我們就需要了解拒絕策略,也就是構造器中最後乙個引數handler。

四種拒絕策略

我們可以通過new threadpoolexecutor.***()來設定策略,有以下四種

執行緒池的工作原理

總結

執行緒池為我們操作執行緒提供了方便,並且使得執行緒資源得已重用,也提高了效能。

七個重要的引數

四種拒絕策略

執行緒池的工作原理

原來你是這樣的PaaS!

啥叫paas?許多人身處網際網路領域,對paas仍然是霧裡看花。它看似複雜,其實只要用對看法,人人都可以輕鬆的認識它。網路上盛傳著用pizza為例子幫助人們了解什麼是paas,那麼編者今天也不舉栗子了,也舉個pizza得了。pizza 本地部署 就是你準備餐桌 烤箱 麵糰 乳酪等所有物品。在家自己做...

店大欺客?原來你是這樣的亞馬遜

前段時間,在亞馬遜下了個訂單,結果等了乙個多月,商品沒等來,卻遇到了亞馬遜單方面取消訂單。收到退款的我大概就是下面這樣的表情 曾經在國內各大電商買過很多東西,都沒有遇到過這樣的情況,怎麼一到亞馬遜就踩坑了呢,難道是運氣太好中了 大獎 於是我開啟了黑貓投訴進行投訴,發現好像也有其他的使用者遇到了類似的...

for迴圈原來是這樣

for迴圈可以說是程式中最靈活,最常用,最重要的乙個迴圈用法,大家經常用到,但是你真正理解for迴圈的執行原理嗎?舉個例子 for i 0 i 8 i 對於這個語句執行結束的時候 i 是多少?經常用,卻沒怎麼注意,執行結束的時候 i 是8 下面說一下for迴圈語句的執行過程 for 表示式1 表示式...