關於ThreadPoolExecutor參數詳解

例子:

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內部創建線程的規則:

  1. 如果線程數小於corePoolSize,則創建一個新線程以運行新任務。
  2. 如果線程數等於(或大於)corePoolSize,則將任務放入隊列。
  3. 如果隊列已滿,並且線程數小於maxPoolSize,則創建一個新線程以運行任務。
  4. 如果隊列已滿,並且線程數大於或等於maxPoolSize,則拒絕該任務。

拒絕策略

ThreadPoolExecutor.AbortPolicy:丟棄任務並拋出RejectedExecutionException異常。 (默認)

ThreadPoolExecutor.DiscardPolicy:丟棄任務,但是不拋出異常。

ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最舊的任務,然後重新提交被拒絕的任務

ThreadPoolExecutor.CallerRunsPolicy:由調用線程(提交任務的線程)處理該任務

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