執行緒池的使用和底層實現

2021-09-01 09:29:43 字數 1768 閱讀 8636

執行緒池是指在初始化乙個多執行緒應用過程中建立的乙個執行緒集合,該執行緒集合使得程式在執行任務時不再需要臨時建立新的執行緒,而是可以直接呼叫執行緒池中的執行緒。執行緒池可以同時執行多個任務,如果任務佇列已滿,則新來的任務會排隊等待,執行緒池的執行緒數量不會大於既定的最大值。

timeunit.days          //天  

timeunit.hours //小時

timeunit.minutes //分鐘

timeunit.seconds //秒

timeunit.milliseconds //毫秒 ,等於1∗10−3s

timeunit.microseconds //微秒,等於1∗10−6s

timeunit.nanoseconds //納秒,等於1∗10−9s

下面說說系統常用的4種執行緒池的實現原理:

public static executorservice newsinglethreadexecutor()
建乙個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務都是按照指定的順序(fifo,lifo,優先順序)執行。

2.newfixedthreadpool() 

public static executorservice newfixedthreadpool(int nthreads)
建立乙個定長線程池,可控制線程最大併發數,超出的執行緒會在佇列中等待。

public static scheduledexecutorservice newscheduledthreadpool(int corepoolsize) 

public scheduledthreadpoolexecutor(int corepoolsize)

固定核心執行緒,主要用於定時任務或者週期性任務。 

public static executorservice newcachedthreadpool()
沒有核心執行緒,不固定執行緒的數量,超時時長60秒,超過後會被**,所以它的特性在空閒時,沒有執行緒幾乎是不占用記憶體的,適用於多量耗時少的任務。 

以上4種都是通過executors 下面對應型別的方法來建立。

1. abort策略:預設策略,不執行此任務,而且直接丟擲乙個執行時異常,切記threadpoolexecutor.execute需要try catch,否則程式會直接退出。

3. discard策略:新提交的任務被拋棄,任務不執行。

4. discardoldest策略:當任務新增到執行緒池中被拒絕時,執行緒池會放棄等待佇列中最舊的未處理任務(拋棄下乙個將被執行的任務),然後將被拒絕的任務新增到等待佇列中,如果佇列是乙個優先佇列,那麼拋棄 最舊的策略就會拋棄優先順序最高的任務,因此不要將兩者在一起使用。

5. 使用者自定義拒絕策略(最常用):實現rejectedexecutionhandler,並自己定義策略模式

/**

* 迴圈,當佇列有空位時,該任務進入佇列,等待執行緒池處理

*/public class testrejectedexecutionhandler implements rejectedexecutionhandler catch (interruptedexception e)

}}

使用執行緒和執行緒池

1 new thread的弊端 執行乙個非同步任務你還只是如下new thread嗎?new thread new runnable start 那你就out太多了,new thread的弊端如下 a.每次new thread新建物件效能差。b.執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭...

執行緒池和程序池的使用

執行緒池和程序池模組 from concurrent.futures import threadpoolexecutor,processpoolexecutor python2版本 執行緒池 不支援 程序池 支援 python3版本 執行緒池 支援 程序池 支援 threadpoolexecutor...

JDK執行緒池和Spring執行緒池的使用

jd 程池和spring執行緒池例項,非同步呼叫,可以直接使用 1 jd 程池的使用,此處採用單例的方式提供,見示例 public class threadpoolutil public static executorservice getexecutorservice 在其它地方可以直接這樣使用 ...