ThreadPoolExecutor的corePoolSize和maximumPoolSize


按照JDK文檔的描述,

  • 如果池中的實際線程數小於corePoolSize,無論是否其中有空閑的線程,都會給新的任務產生新的線程
  • 如果池中的線程數>corePoolSize and <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的實現就可以了^_^)。

 

終於有了符合自己需要的ScheduledThreadPoolExecutor了,現在用它來每秒運行1000個任務,還需要每個小時改變並發任務數(50~200之間的隨機值),至少要維持30天。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM