1. 程式人生 > >Java 多執行緒池ThreadPoolExecutor解析及Executors類中提供的靜態方法來建立執行緒池

Java 多執行緒池ThreadPoolExecutor解析及Executors類中提供的靜態方法來建立執行緒池

上面的程式碼可能看起來不是那麼容易理解,下面我們一句一句解釋:

  首先,判斷提交的任務command是否為null,若是null,則丟擲空指標異常;

  接著是這句,這句要好好理解一下:

if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command))
 

   由於是或條件運算子,所以先計算前半部分的值,如果執行緒池中當前執行緒數不小於核心池大小,那麼就會直接進入下面的if語句塊了。

  如果執行緒池中當前執行緒數小於核心池大小,則接著執行後半部分,也就是執行:

addIfUnderCorePoolSize(command)
 

  如果執行完addIfUnderCorePoolSize這個方法返回false,則繼續執行下面的if語句塊,否則整個方法就直接執行完畢了。

  如果執行完addIfUnderCorePoolSize這個方法返回false,然後接著判斷:

if (runState == RUNNING && workQueue.offer(command))
 

   如果當前執行緒池處於RUNNING狀態,則將任務放入任務快取佇列;如果當前執行緒池不處於RUNNING狀態或者任務放入快取佇列失敗,則執行:

addIfUnderMaximumPoolSize(command)
 

  如果執行addIfUnderMaximumPoolSize方法失敗,則執行reject()方法進行任務拒絕處理。

  回到前面:

if (runState == RUNNING && workQueue.offer(command))
 

   這句的執行,如果說當前執行緒池處於RUNNING狀態且將任務放入任務快取佇列成功,則繼續進行判斷:

if (runState != RUNNING || poolSize == 0)
 

   這句判斷是為了防止在將此任務新增進任務快取佇列的同時其他執行緒突然呼叫shutdown或者shutdownNow方法關閉了執行緒池的一種應急措施。如果是這樣就執行:

ensureQueuedTaskHandled(command)
 

   進行應急處理,從名字可以看出是保證 新增到任務快取佇列中的任務得到處理。