专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

ThreadPoolExecutor线程池任务执行失败的时候会怎样

接上一篇 《JDK1.8中的线程池

1、 任务执行失败时的处理逻辑

1、1、 Worker

Worker相当于线程池中的线程

83_1.png

可以看到,Worker有几个重要的属性:

  • thread : 这是Worker运行的线程,可以理解为一个Worker就是一个线程
  • firstTask : 初始任务,可能为为null
  • completedTasks : Worker完成的任务数

同时,还应该注意到,在构造方法中给thread赋值为一个新线程。由于Worker实现了Runnable接口,也就是说它本身就是可执行的任务,当它启动的时候理所当然应该运行run()方法,而它的run()方法中调用了runWorker(this)方法

1、2. Worker是如何创建的

83_2.png

83_3.png

主要是:创建Workder对象,并将该对象加入到Worker集合中,最后启动Worker(PS:启动Worker中的线程是启动Worker)

1、3. runWorker(this)

83_4.png

83_5.png

可以看到,创建线程的时候传的是this,this代表的是Worker对象,而Worker是一个Runnable,因此当调用线程的start()方法后执行的是Worker的run()方法,而Worker的run()方法里面调用的时候runWorker(this),因此,接下来重点看一下runWorker(this)

83_6.png

如果task.run()方法抛异常,则会被catch捕捉到,但是catch又将异常抛出去了,外层的两个try没有捕获,跳出循环,执行3个finally

我们只看最后一个finally

83_7.png

看到这里,一切真相大白

当任务执行失败后,该Workder会被从Worker集合中删除,然后,只要线程池当前还在继续处理任务,则重新创建一个新的Worker

也就是说,任务执行失败后,原来的Worker就死了,如果线程池还在继续处理任务,则再创建一个新的Worker

2、 拒绝策略

83_8.png

83_9.png

83_10.png

四种策略:

1、 直接抛异常(默认)
2、 什么也不做,也不抛异常
3、 如果线程池当期处于RUNNING状态,则执行这个任务,否则什么也不做
4、 如果线程池当前处于RUNNING状态,则删除队列头部的任务,然后将该任务加到工作任务队列中

3、 其它相关

JDK1.8中的线程池

文章永久链接:https://tech.souyunku.com/21089

未经允许不得转载:搜云库技术团队 » ThreadPoolExecutor线程池任务执行失败的时候会怎样

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们