banner
RustyNail

RustyNail

coder. 【blog】https://rustynail.me 【nostr】wss://ts.relays.world/ wss://relays.world/nostr

ThreadPoolExecutor (線程池執行器)

ThreadPoolExecutor 是一個服務(ExecutorService),用於執行被提交過來的任務(task)的。通常上,會把任務放到從線程池中的線程去執行。

而 ThreadPoolExecutor 可以有不同的線程池可以使用。通過不同的創建方法:Executors.new****ThreadPool ()

  • newCachedThreadPool 沒有邊界,每次都新增一個線程
  • newFixedThreadPool 固定線程大小
  • newSingleThreadExecutor 單線程的線程池

核心 / 最大線程池大小#

當一個新的任務提交過來後(execute (runnable)),會根據 MaximumPoolSize 和 CorePoolSize 兩個參數的設置來決定任務的去向。

如果當前的正在運行的線程數大於 CorePoolSize 而且小於 MaximunPoolSize 且當前的等待隊列滿了,就會創建一個線程。

也就是說,如果把這兩個參數設置成一樣的話,就相當於創建了一個 FixedThreadPool。而如果把 MaximumPoolSize 設置的很大的話,就相當於創建了一個 CachedThreadPool。

存活時間#

線程的存活時間,線程在沒有工作的時候,會在經過這麼後被釋放。如果被設置成很大數的話,很久才能回收資源。不能為零。

拒絕策略#

如果 core pool size 和 maximum pool size 和隊列都滿了,需要對剛加入的新任務進行處理。有幾種處理方式。

  1. 直接在 execute () 的這個線程執行任務
  2. 拋出異常 RejectedExecutionException
  3. 丟棄這個任務。
  4. 將最久(隊列頭處的那個)的一個線程丟棄。

這是提供的方式,也可以自己實現 RejectedExecutionHandler 接口。

new RejectedExecutionHandler() {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {

    }
}

狀態變換#

整個生命周期裡,在 Running、Stop、Shutdown、Tiddying、Terminated 之間轉換。

狀態機

內部類#

worker#

用來執行 task 的。Service 的 private boolean addWorker (Runnable firstTask, boolean core) 根據狀態創建 worker, 並執行。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。