ThreadPoolExecutor執行緒池任務執行失敗的時候會怎樣

不要亂摸發表於2018-12-05

接上一篇 《JDK1.8中的執行緒池

1.  任務執行失敗時的處理邏輯

1.1.  Worker

Worker相當於執行緒池中的執行緒

可以看到,Worker有幾個重要的屬性:

  • thread : 這是Worker執行的執行緒,可以理解為一個Worker就是一個執行緒
  • firstTask : 初始任務,可能為為null
  • completedTasks : Worker完成的任務數

同時,還應該注意到,在構造方法中給thread賦值為一個新執行緒。由於Worker實現了Runnable介面,也就是說它本身就是可執行的任務,當它啟動的時候理所當然應該執行run()方法,而它的run()方法中呼叫了runWorker(this)方法

1.2.  Worker是如何建立的

主要是:建立Workder物件,並將該物件加入到Worker集合中,最後啟動Worker(PS:啟動Worker中的執行緒是啟動Worker)

1.3.  runWorker(this)

可以看到,建立執行緒的時候傳的是this,this代表的是Worker物件,而Worker是一個Runnable,因此當呼叫執行緒的start()方法後執行的是Worker的run()方法,而Worker的run()方法裡面呼叫的時候runWorker(this),因此,接下來重點看一下runWorker(this)

如果task.run()方法拋異常,則會被catch捕捉到,但是catch又將異常丟擲去了,外層的兩個try沒有捕獲,跳出迴圈,執行3個finally

我們只看最後一個finally

看到這裡,一切真相大白

當任務執行失敗後,該Workder會被從Worker集合中刪除,然後,只要執行緒池當前還在繼續處理任務,則重新建立一個新的Worker

也就是說,任務執行失敗後,原來的Worker就死了,如果執行緒池還在繼續處理任務,則再建立一個新的Worker

2.  拒絕策略

  

四種策略:

  1. 直接拋異常(預設)
  2. 什麼也不做,也不拋異常
  3. 如果執行緒池當期處於RUNNING狀態,則執行這個任務,否則什麼也不做
  4. 如果執行緒池當前處於RUNNING狀態,則刪除佇列頭部的任務,然後將該任務加到工作任務佇列中

3.  其它相關

JDK1.8中的執行緒池

 

相關文章