為什麼使用執行緒池呢?
在單執行緒的情況下,只有處理完乙個請求之後,才會去處理下乙個請求,但是在一些io操作阻塞的過程中,cpu是空閒的狀態,這個時候單執行緒不可能去利用cpu去處理其他請求,但是多執行緒就可以實現。但是使用多執行緒的時候,並且每個執行緒都是執行乙個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低系統的效率,因為頻繁建立執行緒和銷毀執行緒需要時間。於是我們使得執行緒池使得執行緒可以復用,就是執行完乙個任務,並不被銷毀,而是可以繼續執行其他的任務。
如何實現多執行緒?
有這麼乙個類:threadpoolexecutor。
該類繼承乙個抽象類,有四個構造器
public
class
threadpoolexecutor
extends
abstractexecutorservice
前面三個構造器都是呼叫的第四個構造器進行的初始化工作
timeunit.days; //天timeunit.hours; //小時
timeunit.minutes; //分鐘
timeunit.seconds; //秒
timeunit.milliseconds; //毫秒
timeunit.microseconds; //微妙
timeunit.nanoseconds; //納秒
arrayblockingqueue;arrayblockingqueue和priorityblockingqueue使用較少,一般使用linkedblockingqueue和synchronous。執行緒池的排隊策略與blockingqueue有關。linkedblockingqueue;
synchronousqueue;
threadpoolexecutor.abortpolicy:丟棄任務並丟擲rejectedexecutionexception異常。具體實現方法threadpoolexecutor.discardpolicy:也是丟棄任務,但是不丟擲異常。
threadpoolexecutor.discardoldestpolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)
threadpoolexecutor.callerrunspolicy:由呼叫執行緒處理該任務
執行結果:
結果中可以得知,核心執行緒建立滿了之後,執行緒將放入到快取任務佇列中,當快取佇列滿了之後再開始繼續建立執行緒(但是最多為15,超過十五開始報錯,由第四個構造器中corepoolsize>maximunsize)
併發程式設計之 執行緒池
執行緒池做的工作主要是控制執行的執行緒的數量,處理過程中將任務放入佇列,然後再執行緒建立後啟動這些任務,如果執行緒數量超過了最大數量,超出數量的執行緒排隊等候,等其它執行緒執行完畢,再從佇列中取出任務來執行。他的主要特點為 執行緒復用 控制最大併發數,管理執行緒。第一 降低資源消耗。通過重複利用已建...
併發程式設計之執行緒池
步驟1 自定義拒絕策略介面 1 執行緒池狀態 threadpoolexecutor使用int的高3位來表示執行緒池狀態,低29位表示執行緒數量 從數字上比較,terminated tidying stop shutdown running 這些資訊儲存在乙個原子變數ctl中目的是將執行緒池狀態與執行...
併發程式設計之執行緒池,程序池
池 受限於硬體的發展,硬體跟不上軟體的發展 在保證計算機硬體安全的情況下,最大限度的利用了計算機 池其實是降低了程式的執行效率,但是保證了計算機硬體的安全 我們再使用程序和執行緒時,不可能無限制的去開程序或執行緒。因此我們需要用到程序池,執行緒池來解決這一問題。1.concurrent模組是用來建立...