设计

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线程池相关推荐

  1. Java并发—线程池ThreadPoolExecutor基本总结

    原文作者:Matrix海子 原文地址:Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线 ...

  2. Java多线程学习总结(4)——ThreadPoolExecutor 线程池的拒绝策略学习总结

    前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用Fix ...

  3. Java Executor源码解析(3)—ThreadPoolExecutor线程池execute核心方法源码【一万字】

    基于JDK1.8详细介绍了ThreadPoolExecutor线程池的execute方法源码! 上一篇文章中,我们介绍了:Java Executor源码解析(2)-ThreadPoolExecutor ...

  4. Java 自定义线程池

    Java 自定义线程池 https://www.cnblogs.com/yaoxiaowen/p/6576898.html public ThreadPoolExecutor(int corePool ...

  5. java定时线程池_java 定时器线程池(ScheduledThreadPoolExecutor)的实现

    前言 定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行.但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外一篇文章多线程–精通Thre ...

  6. 13.ThreadPoolExecutor线程池之submit方法

    jdk1.7.0_79  在上一篇<ThreadPoolExecutor线程池原理及其execute方法>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法 ...

  7. Java中线程池,你真的会用吗

    转载自   Java中线程池,你真的会用吗 在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Ex ...

  8. 自定义java线程池_我的Java自定义线程池执行器

    自定义java线程池 ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,也不必关注核心功能. 我创建了一个自定义线 ...

  9. 我的Java自定义线程池执行器

    ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,而将精力放在核心功能上. 我创建了一个自定义线程池执行程序,以更 ...

最新文章

  1. 用微信公众号做一个网页版商城
  2. Hadoop学习笔记—1.基本介绍与环境配置
  3. Boost:求容器的最小元素和最大元素
  4. tab翻页导致的问题
  5. Spring Boot 导出Excel表格
  6. python3+tkinter实现的黑白棋,代码完整 100%能运行
  7. 你愿意一辈子当一个打工的吗
  8. Xcode 6 的新增特性
  9. loadruner知识点小结
  10. 注册使用GAC【转载】
  11. Linux 安装 JAVA(JDK)
  12. VMware12序列号
  13. 论文常用出图软件(Matlab,XMind,Viso,ppt)以及格式选择(eps,svg,tif,png)
  14. c语言定时器中断实验报告,单片机实验报告-定时器中断实验.doc
  15. DDos防护系列之2--DDos防御策略
  16. 华为USG防火墙NAT
  17. git 拉取最新代码覆盖本地
  18. 成功解决ValueError: Only TF native optimizers are supported in Eager mode
  19. 超级小白的AOP之Springboot 日志工程
  20. 暑期集训1期11暑期集训一期12阶段性测验

热门文章

  1. android 蒙版图片带拖动_黑橙修图:新手入门篇2-一句话带你认识图层蒙版
  2. 洛谷P1852 奇怪的字符串
  3. C语言strcat()库函数的实现
  4. thinkphp所有参数配置
  5. Android开发手记(23) Notification
  6. modelsim不停出现loading……无法仿真
  7. JqGrid3.6最终版本今天发布了
  8. CSS背景颜色渐变处理
  9. (9)vivado ila IP使用示例(学无止境)
  10. (26)IMPCAT软件bit文件下载流程(FPGA不积跬步101)