JAVA ThreadPoolExecutor线程池
设计
ThreadPoolExecutor中存在内部类Worker, 线程池通过HashSet<Worker>保存这些Worker对象。Worker类实现Runnable接口,Worker对象就是实际的任务执行者,同时也代表一个独立线程。每一个Worker对象在实例化时通过ThreadFactory创建一个自己专属的线程。这个专属线程启动后执行这个Worker对象的run方法。Worker的run方法执行从BlockingQueue<Runnable>中取得任务,并执行任务runnable.run方法。
注意
1 不要用无限队列,应为可能造成大量任务堆积,内存无法释放
执行逻辑
任务提交到线程池后先交给核心线程,若无空闲则放入队列中,若队列已满则尝试交给备用线程。若以上都不能成功,则启动拒绝策略。
状态
由大到小依次是:
RUNNING:接受新的任务,处理队列任务;
SHUTDOWN:不在接受新的任务,处理队列任务;
STOP:不在接受新任务,不处理队列任务,中断正在执行的任务线程。shutDownNow();
TIDYING:所有的任务已经结束,任务线程为0,线程池转换到TIDYING;
TERMINATED:停止,线程池已结束,且无任务在执行,即terminated()方法执行完。
关闭线程池
可以通过调用线程池的shutdown()或shutdownNow()方法来关闭线程池。他们的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无响应中断的任务可能永远无法停止。只要调用了这两个关闭方法的一个,isShutdown()就会返回true。当所有的任务都关闭后,才表示线程池关闭成功,这是调用isTerminated()方法会返回true。shutdown方法只是发出了停止信号,等所有任务执行完毕会关闭线程池;而shutdownNow则是立即停止所有任务,返回未执行任务List<Runable>(但是已执行未完成被终止的任务不包含),调用isTerminated()方法会返回true。
isTerminated当调用shutdown()方法后,并且所有提交的任务完成后返回为true;
isTerminated当调用shutdownNow()方法后,成功停止后返回为true;
线程数配置
分布式时要考虑多机生产消费能力和通讯消耗。
最低线程数 : 依据生产者的每秒平均生产能力、单一线程每秒的平均消费能力。
最高线程数 : 依据生产者的每秒可能的峰值生产能力 、单一线程每秒的可能的最低/平均消费能力。
缓冲线程数: 依据情况而定
1) CPU密集型任务的线程池配置
因为cpu执行速度非常快,往往切换线程上下文环境所耗费的时间比执行代码花费的时间更长,所以CPU密集型任务的线程数应该尽量保持和CPU核数一致,以减少线程切换带来的性能损耗。
2) IO密集型任务的线程池配置
IO密集型任务的主要性能瓶颈在于等待IO结果,而CPU利用率比较低,当遇到任务中存在从DB中读取数据、从缓存中读取数据时、远程通信等,就可以认为是IO密集型任务。一般而言业务系统配置线程池基本上都会采用上边的模型配置。
转载于:https://www.cnblogs.com/sw008/p/11054267.html
JAVA ThreadPoolExecutor线程池相关推荐
- Java并发—线程池ThreadPoolExecutor基本总结
原文作者:Matrix海子 原文地址:Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线 ...
- Java多线程学习总结(4)——ThreadPoolExecutor 线程池的拒绝策略学习总结
前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用Fix ...
- Java Executor源码解析(3)—ThreadPoolExecutor线程池execute核心方法源码【一万字】
基于JDK1.8详细介绍了ThreadPoolExecutor线程池的execute方法源码! 上一篇文章中,我们介绍了:Java Executor源码解析(2)-ThreadPoolExecutor ...
- Java 自定义线程池
Java 自定义线程池 https://www.cnblogs.com/yaoxiaowen/p/6576898.html public ThreadPoolExecutor(int corePool ...
- java定时线程池_java 定时器线程池(ScheduledThreadPoolExecutor)的实现
前言 定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行.但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外一篇文章多线程–精通Thre ...
- 13.ThreadPoolExecutor线程池之submit方法
jdk1.7.0_79 在上一篇<ThreadPoolExecutor线程池原理及其execute方法>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法 ...
- Java中线程池,你真的会用吗
转载自 Java中线程池,你真的会用吗 在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Ex ...
- 自定义java线程池_我的Java自定义线程池执行器
自定义java线程池 ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,也不必关注核心功能. 我创建了一个自定义线 ...
- 我的Java自定义线程池执行器
ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,而将精力放在核心功能上. 我创建了一个自定义线程池执行程序,以更 ...
最新文章
- 用微信公众号做一个网页版商城
- Hadoop学习笔记—1.基本介绍与环境配置
- Boost:求容器的最小元素和最大元素
- tab翻页导致的问题
- Spring Boot 导出Excel表格
- python3+tkinter实现的黑白棋,代码完整 100%能运行
- 你愿意一辈子当一个打工的吗
- Xcode 6 的新增特性
- loadruner知识点小结
- 注册使用GAC【转载】
- Linux 安装 JAVA(JDK)
- VMware12序列号
- 论文常用出图软件(Matlab,XMind,Viso,ppt)以及格式选择(eps,svg,tif,png)
- c语言定时器中断实验报告,单片机实验报告-定时器中断实验.doc
- DDos防护系列之2--DDos防御策略
- 华为USG防火墙NAT
- git 拉取最新代码覆盖本地
- 成功解决ValueError: Only TF native optimizers are supported in Eager mode
- 超级小白的AOP之Springboot 日志工程
- 暑期集训1期11暑期集训一期12阶段性测验