本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7681529.html

解决问题:

1、 处理大量异步任务时能减少每个任务的资源开销;

2、 线程通过线程池管理,减少线程的资源开销;

3、 统计当前任务完成数量以及活跃线程数;

个人认为关键是线程池与任务队列如何完美协作

通过下图说明ThreadPoolExecutor机制

1. 线程池中现有线程(current threads) < corePoolSize(线程池基本线程)

i> 保证线程池中线程数量达到corePoolSize大小 (allowCoreThreadTimeOut=true 除外)

ii> 如果新提交一个任务(new task submitted),即使当前现有线程处于idle状态,线程池也会启动一个新的线程来处理该任务;

iii> 如果新提交一个任务(new task submitted),线程池(Executor)优先开启线程处理task,而不是进queue,

直到current threads >= corePoolSize时,new task 先进入queue然后等待处理;

2. corePoolSize(线程池基本线程) < 线程池中现有线程 < maximumPoolSize(线程池最大线程)

i> 如果新提交一个任务(new task submitted),只有当queue已满的情况下,线程池才会启动一个新的线程来处理,

否则只有等当前线程处理完任务后再来处理new task;

ii> 超过了线程驻留时间(Keep-alive time),超过的线程(currrent size - corePoolSize)终止,释放资源;

setKeepAliveTime动态调整驻留空闲时间;

3. 线程池中现有线程(current threads) > maximumPoolSize(线程池最大线程)

i> 如果新提交一个任务(new task submitted),线程池还是会创建一个新的线程,只不过new task 被拒绝(rejected);

new task 被拒绝(rejected)处理策略:

a> ThreadPoolExecutor.AbortPolicy : 运行时抛出异常(RejectedExecutionException)

b> ThreadPoolExecutor.CallerRunsPolicy: 该线程通过简单的反馈控制机制来重新处理该任务的请求,减慢任务入队列的时间,
从而达到线程处理任务的速度快于任务到达队列的速度;

优点:不抛出异常中断线程,不丢失任务;如下图

c> ThreadPoolExecutor.DiscardPolicy: 直接扔掉任务

d> ThreadPoolExecutor.DiscardOldestPolicy: 按照进入顺序扔掉队列另一端最先进入的任务,腾出空间,然后将新任务入队列;

最新文章

  1. Oracle分析函数入门
  2. java对xml节点属性的增删改查
  3. 百度地图-省市县联动加载地图 分类: Demo JavaScript 2015-04-26 13:08 530人阅读 评论(0) 收藏
  4. C#如何实现下载文件保存到本地上面去
  5. Filestream 使用简单步骤
  6. jQuery插件之simplemodal
  7. atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 。打开浏览服务器文件夹java .net php
  8. css margin居中的问题
  9. this.class.getClassLoader()怎么理解?
  10. 九度OJ 1348 数组中的逆序对 -- 归并排序
  11. shell记录
  12. VBA开发中的前绑定与后绑定
  13. Mysql配置调优(转自阿铭论坛)
  14. halcon与C#混合编程进阶版
  15. vultr vps注册和后台教程
  16. Zabbix实战-简易教程--技巧一(操作类技巧)
  17. MongoDB 3.0新增特性一览
  18. Qt中在UI文件中新建控件并命名,但在代码中无法识别UI中的控件?
  19. IPv6实验1_IPv6地址配置
  20. 本地测试使用Tomcat,生产环境使用GlassFish。

热门文章

  1. 201521123105 第三周Java学习总结
  2. 201521123007《Java程序设计》第1周学习总结
  3. 201521123051《Java程序设计》第十四周学习总结
  4. 聊一聊我的阿里云ECS云主机
  5. [js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义
  6. python基础之字典、赋值补充
  7. 在java中使用MongoDB数据库
  8. Microsoft Visual Studio调试监视器(MSVSMON.EXE)未能启动
  9. php字符的替换,截取,指定查找
  10. Nginx学习——Nginx基本配置