java线程池任务失败_ThreadPoolExecutor线程池任务执行失败的时候会怎样
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.? 拒絕策略
四種策略:
直接拋異常(默認)
什么也不做,也不拋異常
如果線程池當期處于RUNNING狀態,則執行這個任務,否則什么也不做
如果線程池當前處于RUNNING狀態,則刪除隊列頭部的任務,然后將該任務加到工作任務隊列中
3.? 其它相關
總結
以上是生活随笔為你收集整理的java线程池任务失败_ThreadPoolExecutor线程池任务执行失败的时候会怎样的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java重载方法math_Java语言程
- 下一篇: java 数据返回类_java返回数据