ThreadPoolExecutor线程池任务执行失败的时候会怎样
时间:2018-12-06
本文章向大家介绍ThreadPoolExecutor线程池任务执行失败的时候会怎样,主要包括ThreadPoolExecutor线程池任务执行失败的时候会怎样相关应用实例、知识点总结和注意事项,具有一定的参考价值,需要的朋友可以参考一下。
接上一篇 《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. 其它相关
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 本体入门(一):本体构建 101
- 大数据获取案例:Python网络爬虫实例
- 【pyspark】parallelize和broadcast文件落盘问题(后续)
- 【Tbase开源版测评】基于PostgreSQL的国产开源数据库初体验
- 聊聊RedisToken
- 【Ceph RGW】Bucket Sharding的设置
- 每日手撕一道算法-1143.最长公共子序列
- 理解JavaScript 中的执行上下文和执行栈
- Spring Boot 2.x基础教程:使用集中式缓存Redis
- 彻底理解 Cookie、Session、Token、JWT这些登录授权方法
- 本体入门(二):OWL 本体构建指南f
- LeetCode 刷题记录(三)
- LeetCode 刷题记录(二)
- Qt音视频开发11-ffmpeg常用命令
- 《SICP》读书笔记之一:构造过程抽象(上)