博客
关于我
ThreadPoolExecutor线程池任务执行失败的时候会怎样
阅读量:407 次
发布时间:2019-03-06

本文共 919 字,大约阅读时间需要 3 分钟。

接上一篇 《

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.  其它相关

 

转载地址:http://xaqkz.baihongyu.com/

你可能感兴趣的文章
从零开始学安全(十六)● Linux vim命令
查看>>
从零开始学安全(三十四)●百度杯 ctf比赛 九月场 sqli
查看>>
3389连接痕迹清除
查看>>
发生系统错误 6118
查看>>
c# API接受图片文件以文件格式上传图片
查看>>
阿里巴巴Json工具-Fastjson教程
查看>>
Spring Cloud Gateway - 快速开始
查看>>
Spring Security 实战干货:理解AuthenticationManager
查看>>
Java对象转JSON时如何动态的增删改查属性
查看>>
Python 面向对象进阶
查看>>
Linux常用统计命令之wc
查看>>
Git安装及使用以及连接GitHub方法详解
查看>>
docker容器与虚拟机的区别
查看>>
shell脚本里使用echo输出颜色
查看>>
Python2跟Python3的区别
查看>>
并发编程——IO模型详解
查看>>
Java之封装,继承,多态
查看>>
wait()与notify()
查看>>
使用js打印时去除页眉页脚
查看>>
Spring security OAuth2.0认证授权学习第二天(基础概念-RBAC)
查看>>