1、減少資源的消耗:較少執行緒建立和銷毀造成的消耗
2、提高響應速度:當任務到達的時候,就能夠立刻執行,減少了執行緒建立和銷毀的時間
3、能夠更好地管理執行緒
executor:介面,是執行緒池的基礎,將任務的提交與任務的執行分離開來。
executorservice:介面:繼承了executor,新加了shutdown(),submit()
abstractexecutorservice:實現了executorservice大部分方法,可以少寫很多**
threadpoolexecutor:執行緒池的核心實現了,用來執行被提交的任務
scheduledexecutorservice:提供了帶週期執行的executorservice
scheduledthreadpoolexecutor:可以延遲執行任務
public threadpoolexecutor(
int corepoolsize,
int maximumpoolsize,
long keepalivetime,
timeunit unit,
blockingqueueworkqueue,
threadfactory threadfactory,
rejectedexecutionhandler handler)
執行緒池中的核心執行緒數,當提交乙個任務時,執行緒池建立乙個新執行緒執行任務,直到執行緒數=corepoolsize,之後提交的任務會被儲存到阻塞佇列中,等待被執行。
備註:如果執行了執行緒池的prestartallcorethreads()方法,執行緒池會提前建立好
corepoolsize數量的執行緒,提高效率
如果執行緒數=corepoolsize,且阻塞佇列也被塞滿了,這個時候再提交任務,就會再建立執行緒執行任務,但是執行緒池匯流排程數必須<=
maximumpoolsize
當執行緒數》corepoolsize時,當前執行緒沒有任務執行,執行緒繼續存活的時間
keepalivetime執行緒存活的時間單位
timeunit.hours.tomillis(1)
1小時轉分
timeunit.hours.tominutes(60)
60小時轉分
timeunit.hours.sleep(5)
執行緒休眠5秒
timeunit.hours.convert(1, timeunit.minutes)
1小時轉秒
常用工具類
timeunit.days
日的工具類
timeunit.hours
時的工具類
timeunit.minutes
分的工具類
timeunit.seconds
秒的工具類
timeunit.milliseconds
毫秒的工具類
workqueue必須是blockingqueue阻塞佇列:當執行緒池的執行緒數超過corepoolsize的時候,多餘的執行緒就會進入阻塞佇列中,等待被執行
應當盡量使用有界阻塞佇列,比如:linkedblockingqueue、arrayblokngqueue、synchronousqueue、priorityblockingqueue,使用無界阻塞佇列(比如:delayqueue、linkedtransferqueue)會產生如下影響
1、當執行緒數超過corepoolsize之後,其他執行緒就會放在無界佇列中等待,就不會再建立新的執行緒來執行任務了,導致界佇列時maximumpoolsize將是乙個無效引數。
2、由於1,使用無界佇列的keepalivetime引數無效
3、無界佇列可能會耗盡系統資源
建立執行緒的工廠,使用場景
1、通過自定義的執行緒工廠,給每個新建的執行緒設定乙個有識別度的執行緒名
2、通過執行緒工廠把所有的執行緒設定為守護執行緒
demo
public class test
},// new threadpoolexecutor.callerrunspolicy());
// new threadpoolexecutor.discardoldestpolicy());
// new threadpoolexecutor.discardpolicy());
new abortpolicy());}}
當阻塞佇列被塞滿了,並且沒有多餘的執行緒執行任務的時候,對於新新增進來的任務必須做乙個處理
abortpolicy
預設:直接拋異常
callerrunspolicy
用呼叫者執行緒來執行(比如main)
discardoldestpolicy
丟掉佇列中最靠前的任務,並執行當前任務
discardpolicy
直接丟掉任務
實現rejectedexecutionhandler
日誌記錄或者持久化儲存
public class test
},// new threadpoolexecutor.callerrunspolicy());
// new threadpoolexecutor.discardoldestpolicy());
// new threadpoolexecutor.discardpolicy());
new abortpolicy());}}
執行緒池總類以及執行緒池的核心引數簡述
jdk自帶執行緒池總類 1 newfixedthreadpool建立乙個指定工作執行緒數量的執行緒池。每當提交乙個任務就建立乙個工作執行緒,如果工作執行緒數量達到執行緒池初始的最大數,則將提交的任務存入到池佇列中。2 newcachedthreadpool建立乙個可快取的執行緒池。這種型別的執行緒池...
執行緒池引數以及說明
一 七大核心引數 1.corepoolsize 核心執行緒數 2.maximumpoolsize 最大執行緒池引數 3.keepalivetime 任務結束後,執行緒存活此處指定時間後才會被釋放 4.timeunit 上乙個引數的單位,常用s,ms 5.blockingqueue 佇列,當核心執行緒...
為什麼要用執行緒池,執行緒池的引數解釋
為什麼要用執行緒池?1 降低資源消耗 提高執行緒利用率,降低建立和銷毀執行緒的消耗。2 提高響應速度 任務來了,直接有執行緒可用可執行,而不是先建立執行緒,再執行。3 提高執行緒的可管理性 執行緒是稀缺資源,使用執行緒池可以統一分配調優監控。corepoolsize代表核心執行緒數,也就是正常情況下...