線程池的創建和使用(總結1)

線程池的創建和使用
1創建線程池的7個參數
一般我們推薦使用ThreadPoolExecutor()自定義創建線程池,因爲這比較靈活切可控。

int corePoolSize 核心線程數,即確定有多少個核心線程。
int maximumPoolSize 最大線程數,即限定線程池中的最大線程數量。
long keepAliveTime 非核心線程的存活時間,配合下面的TimeUnit參數確定時間。
TimeUnit unit 一個時間類型的枚舉類。有從納秒到天的時間量度,配合上面的keepAliveTime確定非核心線程的存活時間。
BlockingQueue workQueue 裝載Runnable的阻塞隊列,具體類型可以自己確定。有7種
ThreadFactory threadFactory 線程工廠,這是一個函數式接口,裏面只定義了一個newThread(Runnable task)方法,需要自己實現工廠的方法,在這裏我們可以對線程進行自定義的初始化,例如給線程設定名字,這樣方便後期的調試。
RejectedExecutionHandler handler 拒絕服務處理,這也是一個函數式接口,我們需要實現rejectedExecution(Runnable r,ThreadPoolExecutor executor)這個方法,這裏可以根據需求自定義你希望在處理邏輯。當然Java裏面也有已經定義好的四種策略靜態類。可以通過ThreadPoolExecutor調用

2.使用ThreadPoolExecutor可以創建的幾種線程池

2.1 FixedThreadPool 固定核心線程的線程池。

特點:它的核心線程數量就是最大線程數,所以線程池內的線程永遠不會消亡,它採用了無參數的鏈表阻塞隊列,最大的任務數可達232-1個。因此存在任務積壓導致內存溢出的風險。

2.2. CachedThreadPool 緩存線程池

特點:沒有核心線程,線程池不能滿足任務運行時會創建新的線程,線程數量沒有上限。默認的消亡時間爲60秒。值得注意的是:它的阻塞隊列是SynchronousQueue,這是一個沒有存儲性質的阻塞隊列,它的取值操作和放入操作必須是互斥的。根據源碼文檔的解釋,可以理解爲每當有任務放入時會立即有線程將它取出執行。

2.3. ScheduledThreadPool 固定調度線程池

特點:有固定的核心線程,線程的數量沒有限制,默認存活時間爲60秒。同時支持定時及週期性任務執行。

2.4. SingleThreadExecutor 單核心線程池

特點:只有一個核心線程,所以能保證任務的串行化執行。

2.5. WorkStealingPool 並行執行線程池

特點:在jdk8中實現
線程池。它內部的線程池實現是ForkJoinPool,這是一個可以同時利用多個線程來執行任務的線程池。無參默認使用CPU數量的線程數執行任務,由於這個線程池比較複雜

3線程池接口關係
在這裏插入圖片描述
4ThreadPoolExecutor中execute()方法
execute方法使用
參考以下鏈接https://www.xilidou.com/2018/02/09/thread-corepoolsize/
5.線程池拒絕策略
當請求線程數大於最大線程數+阻塞隊列數後,參考以下鏈接學習
拒絕策略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章