例子:
ThreadPoolExecutor executorPool =
new ThreadPoolExecutor(3, 5, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(50));
3是corePoolSize
- 意味着Jvm將爲前3個任務的新任務創建新線程。並且其他任務將被添加到隊列中,直到隊列變滿(50個任務)。
5是maxPoolSize
- JVM可以創建最多5個線程。表示如果已經有3個任務/線程正在運行且隊列已滿,有50個待處理任務,並且如果還有一個新請求/任務到達隊列,那麼JVM將創建最多5個新線程(總線程數=前3個+新2個) ;
new LinkedBlockingQueue
(50) - 總隊列大小 - 它可以在其中排隊50個任務。
即當請求進入時,線程將最多創建3個,然後新請求將被添加到隊列中,直到達到50,當隊列已滿時,將創建最新的線程maxPoolSize
。一旦所有線程都在使用並且隊列已滿,任務將被拒絕。隨着隊列的減少,活動線程的數量也會減少。
SUN內部創建線程的規則:
- 如果線程數小於
corePoolSize
,則創建一個新線程以運行新任務。 - 如果線程數等於(或大於)
corePoolSize
,則將任務放入隊列。 - 如果隊列已滿,並且線程數小於
maxPoolSize
,則創建一個新線程以運行任務。 - 如果隊列已滿,並且線程數大於或等於
maxPoolSize
,則拒絕該任務。
拒絕策略
ThreadPoolExecutor.AbortPolicy:丟棄任務並拋出RejectedExecutionException
異常。 (默認)
ThreadPoolExecutor.DiscardPolicy:丟棄任務,但是不拋出異常。
ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最舊的任務,然後重新提交被拒絕的任務
ThreadPoolExecutor.CallerRunsPolicy:由調用線程(提交任務的線程)處理該任務