ThreadPoolExecutor的corePoolSize和maximumPoolSize

按照JDK文檔的描述,

如果池中的實際線程數小於corePoolSize,無論是否其中有空閒的線程,都會給新的任務產生新的線程
如果池中的線程數大於corePoolSize 並且小於maximumPoolSize,而又有空閒線程,就給新任務使用空閒線程,如沒有空閒線程,則產生新線程
如果池中的線程數=maximumPoolSize,則有空閒線程使用空閒線程,否則新任務放入workQueue。(線程的空閒只有在workQueue中不再有任務時才成立)
ThreadPoolExecutor中有方法setCorePoolSize()和setMaximumPoolSize來設置corePoolSize和maximumPoolSize的大小,
如果新值大於舊值,則對新任務新線程
如果新值小於舊值,則在有線程空閒時,減少池中的線程數
但是在實際應用中想實時修改池的線程數,得有一定的條件,特別是要減少線程數,

首先,如果提交的新任務太多,以至總是沒有線程空閒下來,線程就不會減少
即使有線程空閒,也不一定能減少線程,這還同所使用的workQueue有關,還需要workQueue.remainingCapacity==0。在JDK所提供的所有BlockingQueue中,只有SynchronousQueue的remainingCapacity()能返回0。
而如果實際應用中需要使用ScheduledThreadPoolExecutor來安排任務,同時需要新安排的任務數又非常多,這時要即時動態線程池的大小,就幾乎不可能了,因爲ScheduledThreadPoolExecutor用的是LinkedBlockingQueue。這時可以按照JDK的方式實現一個自己的ScheduledThreadPoolExecutor,

首先,稍微修改一下JDK的ThreadPoolExecutor就能實現一個自己的ThreadPoolExecutor,

在setCorePoolSize方法中,去掉workQueue.remainingCapacity==0的條件
讓ThreadPoolExecutor中的Worker的interruptIfIdle()方法給Worker設置一個標誌,讓這個Worker不再檢查workQueue中還沒有執行的任務,立即中止
還有就是修改一下ThreadPoolExecutor中實現的RejectedExecutionHandler,畢竟很多情況下都可以不需要它
有了自己ThreadPoolExecutor,就可以繼承它來實現自己的ScheduledThreadPoolExecutor了(再原本照抄JDK的ScheduledThreadPoolExecutor的實現就可以了^_^)。

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