java线程池任务失败_ThreadPoolExecutor线程池任务执行失败的时候会怎样
1.? 任務(wù)執(zhí)行失敗時(shí)的處理邏輯
1.1.? Worker
Worker相當(dāng)于線程池中的線程
可以看到,Worker有幾個(gè)重要的屬性:
thread : 這是Worker運(yùn)行的線程,可以理解為一個(gè)Worker就是一個(gè)線程
firstTask : 初始任務(wù),可能為為null
completedTasks : Worker完成的任務(wù)數(shù)
同時(shí),還應(yīng)該注意到,在構(gòu)造方法中給thread賦值為一個(gè)新線程。由于Worker實(shí)現(xiàn)了Runnable接口,也就是說它本身就是可執(zhí)行的任務(wù),當(dāng)它啟動(dòng)的時(shí)候理所當(dāng)然應(yīng)該運(yùn)行run()方法,而它的run()方法中調(diào)用了runWorker(this)方法
1.2.? Worker是如何創(chuàng)建的
主要是:創(chuàng)建Workder對(duì)象,并將該對(duì)象加入到Worker集合中,最后啟動(dòng)Worker(PS:啟動(dòng)Worker中的線程是啟動(dòng)Worker)
1.3.? runWorker(this)
可以看到,創(chuàng)建線程的時(shí)候傳的是this,this代表的是Worker對(duì)象,而Worker是一個(gè)Runnable,因此當(dāng)調(diào)用線程的start()方法后執(zhí)行的是Worker的run()方法,而Worker的run()方法里面調(diào)用的時(shí)候runWorker(this),因此,接下來重點(diǎn)看一下runWorker(this)
如果task.run()方法拋異常,則會(huì)被catch捕捉到,但是catch又將異常拋出去了,外層的兩個(gè)try沒有捕獲,跳出循環(huán),執(zhí)行3個(gè)finally
我們只看最后一個(gè)finally
看到這里,一切真相大白
當(dāng)任務(wù)執(zhí)行失敗后,該Workder會(huì)被從Worker集合中刪除,然后,只要線程池當(dāng)前還在繼續(xù)處理任務(wù),則重新創(chuàng)建一個(gè)新的Worker
也就是說,任務(wù)執(zhí)行失敗后,原來的Worker就死了,如果線程池還在繼續(xù)處理任務(wù),則再創(chuàng)建一個(gè)新的Worker
2.? 拒絕策略
四種策略:
直接拋異常(默認(rèn))
什么也不做,也不拋異常
如果線程池當(dāng)期處于RUNNING狀態(tài),則執(zhí)行這個(gè)任務(wù),否則什么也不做
如果線程池當(dāng)前處于RUNNING狀態(tài),則刪除隊(duì)列頭部的任務(wù),然后將該任務(wù)加到工作任務(wù)隊(duì)列中
3.? 其它相關(guān)
總結(jié)
以上是生活随笔為你收集整理的java线程池任务失败_ThreadPoolExecutor线程池任务执行失败的时候会怎样的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java重载方法math_Java语言程
- 下一篇: 原神雪山三个碎片在哪