ThreadPoolExecutor线程池任务执行失败的时候会怎样
程序员文章站
2022-10-10 20:19:08
接上一篇 《JDK1.8中的线程池》 1. 任务执行失败时的处理逻辑 1.1. Worker Worker相当于线程池中的线程 可以看到,Worker有几个重要的属性: thread : 这是Worker运行的线程,可以理解为一个Worker就是一个线程 firstTask : 初始任务,可能为为n ......
接上一篇 《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. 拒绝策略
四种策略:
- 直接抛异常(默认)
- 什么也不做,也不抛异常
- 如果线程池当期处于running状态,则执行这个任务,否则什么也不做
- 如果线程池当前处于running状态,则删除队列头部的任务,然后将该任务加到工作任务队列中
3. 其它相关