一 線程池的七個參數
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
線程池一共有七個構造函數,看看他的作用吧:
1、int corePoolSize 線程池核心線程大小即線程創建的最小線程數
線程池中會維護一個最小線程數量,即使這些線程處於空閑狀態,也不會被銷毀,除非設置了allowCoreThreadTimeOut。這里的最小線程數就是corePoolSize
2、int maximumPoolSize 線程池的最大線程數量
一個任務被提交到線程池后,首先會緩存到工作隊列中,如果工作隊列滿了,則會創建一個新線程,然后從工作隊列中去除一個任務交由新線程來處理,而將剛提交的任務放入到工作隊列中線程池不會無限制的去創建新線程,會有一個最大線程數量的限制,這個數量是有maximumPoolSize 來控制
3、long keepAliveTime 空閑線程存活時間
一個線程處於空閑狀態,並且當前的線程數量大於corePoolSize,那么在指定時間內,這個空閑線程就會被銷毀,這個指定時間是由keepAliveTime來設定
4、TimeUnit unit 空閑線程存活時間單位
是keepAliveTime 的計量單位
5、BlockingQueue<Runnable> workQueue 工作隊列
新任務被提交后,會先進入到此工作隊列中,任務調度時再從隊列中取出任務,jdk提供了四種工作隊列,可以了解一下:
1) ArrayBlockingQueue
基於數組的有界阻塞隊列, 於數組的有界阻塞隊列,按FIFO排序。新任務進來后,會放到該隊列的隊尾,有界的數組可以防止資源耗盡問題。當線程池中線程數量達到corePoolSize后,再有新任務進來,則會將任務放入該隊列的隊尾,等待被調度。如果隊列已經是滿的,則創建一個新線程,如果線程數量已經達到maxPoolSize,則會執行拒絕策略。
2) LinkedBlockingQuene
6、ThreadFactory threadFactory 線程工廠
創建一個新線程時使用的工廠,可以用來設定線程名、是否為daemon線程等等
7、RejectedExecutionHandler handler 拒絕策略
當工作隊列中的任務已到達最大限制,並且線程池中的線程數量也達到最大限制,這時如果有新任務提交進來,該如何處理呢。這里的拒絕策略,就是解決這個問題的,jdk中提供了4中拒絕策略:
1)CallerRunsPolicy
該策略下,在調用者線程中直接執行被拒絕任務的run方法,除非線程池已經shutdown,則直接拋棄任務。