如果是IO密集型应用,则线程池大小设置为2N+1;

如果是CPU密集型应用,则线程池大小设置为N+1;

N代表CPU的核数。

假设我的服务器是4核的,且一般进行大数据运算,cpu消耗较大,那么线程池数量设置为5为最优。

(现在很多项目线程池滥用,注意分配线程数量,建议不要动态创建线程池,尽量将线程池配置在配置文件中,这样方便以后整体的把控和后期维护。每个核心业务线程池要互相独立,互不影响。)

例子(spring):


  1. <bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"
  2. id="userPrivacyDataObtainThreadPool">
  3. <!-- 核心线程数 -->
  4. <property value="6" name="corePoolSize"/>
  5. <!-- 最大线程数 -->
  6. <property value="10" name="maxPoolSize"/>
  7. <!-- 队列最大长度 >=mainExecutor.maxSize -->
  8. <property value="200" name="queueCapacity"/>
  9. <!-- 线程池维护线程所允许的空闲时间 -->
  10. <property value="300" name="keepAliveSeconds"/>
  11. <!-- 线程池对拒绝任务(无线程可用)的处理策略 -->
  12. <property name="rejectedExecutionHandler">
  13. <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
  14. </property>
  15. </bean>

再附上scheduler定时任务的线程池配置:


  1. <!--项目内定时任务 -->
  2. <bean id="scheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
  3. <!-- 设置线程池容量,也是最大并发线程数 -->
  4. <property name="poolSize" value="2" />
  5. <!-- 当任务被取消的同时从当前调度器移除 -->
  6. <property name="removeOnCancelPolicy" value="true" />
  7. <!-- 线程名前缀 -->
  8. <property name="threadNamePrefix" value="cashpay-scheduler-" />
  9. <!-- 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁 -->
  10. <property name="awaitTerminationSeconds" value="60" />
  11. <!-- 当调度器shutdown被调用时等待当前被调度的任务完成 -->
  12. <property name="waitForTasksToCompleteOnShutdown" value="true" />
  13. <!-- 线程池对拒绝任务(无线程可用)的处理策略 -->
  14. <property name="rejectedExecutionHandler">
  15. <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
  16. </property>
  17. </bean>

注:java代码往线程池中添加线程时,需要用try...catch...包含,因为可能会因为线程池队列满而抛出异常(见rejectedExecutionHandler)(虽然这种情况不多见),java中没有显示的声明,少糖语言是出了名的。。。

原文地址:https://blog.csdn.net/wangpeng322/article/details/80737583

Executor线程池的最佳线程数量计算的更多相关文章

  1. 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程

    额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...

  2. Java多线程系列--“JUC线程池”03之 线程池原理(二)

    概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...

  3. 线程池之ThreadPoolExecutor线程池源码分析笔记

    1.线程池的作用 一方面当执行大量异步任务时候线程池能够提供较好的性能,在不使用线程池的时候,每当需要执行异步任务时候是直接 new 一线程进行运行,而线程的创建和销毁是需要开销的.使用线程池时候,线 ...

  4. 深入浅出 Java Concurrency (34): 线程池 part 7 线程池的实现及原理 (2)[转]

    线程池任务执行流程 我们从一个API开始接触Executor是如何处理任务队列的. java.util.concurrent.Executor.execute(Runnable) Executes t ...

  5. Java多线程系列--“JUC线程池”01之 线程池架构

    概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容——线程池.内容包括:线程池架构 ...

  6. Java多线程系列--“JUC线程池”02之 线程池原理(一)

    概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...

  7. Java多线程系列--“JUC线程池”04之 线程池原理(三)

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基 ...

  8. Java多线程系列--“JUC线程池”05之 线程池原理(四)

    概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...

  9. 内存池、进程池、线程池介绍及线程池C++实现

    本文转载于:https://blog.csdn.net/ywcpig/article/details/52557080 内存池 平常我们使用new.malloc在堆区申请一块内存,但由于每次申请的内存 ...

随机推荐

  1. iOS 9 学习系列:Storyboard References

    http://www.cocoachina.com/ios/20150922/13474.html 如果你曾经使用 interface builder 创建过一个复杂.界面非常多的应用,你就会明白最后 ...

  2. android GUI 流程记录

    ViewRootImpl 与 wms ViewRootImple里的 WindowSeesion是WindowManagerService的proxy, 通过这个句柄来调用WMS的功能而W是 wms用 ...

  3. AGC029 E: Wandering TKHS

     E: Wandering TKHS - AtCoder Grand Contest 029 | AtCoder 分类讨论好题(也不太算分类讨论) 方法:感受过程手玩,考虑能不能提前预算一些东西,或者 ...

  4. laravel 项目本地版本为5.5,线上mysql 为5.7.21版本,执行严格模式

    看到网上很多说修改 但是在mysql 5.7中没有这个参数设置,故放弃: 结合本项目sina_id 10位超过int的最大范围4294967295,所以报错,修改为bigint  即可.

  5. git 密钥

    为什么配置SHH呢?是为了方便我们剪切代码的时间免密码输入,特别方便如何配置呢? 首先安装git: 先到官网下载:官网下载git 然后安装后在桌面任意空白处右击,选择Git Base Here即可如下 ...

  6. Python发送邮件(带附件的)

    有时候做自动化测试任务,任务完成后,需要将结果自动发送一封邮件,这里用到smtplib模块,直接导入就行,这里以163邮箱为例,需要用到授权码,我用类写一下: 如果是发送qq邮箱,要将smtp 改成s ...

  7. 部署zabbix3.2.7,升级到3.4、proxy部署

    一.Server安装 可以使用mysql.percona.mariadb等,本例使用mariadb.由于是事后整理,只截取部分命令. #yum install mariadb-server maria ...

  8. el-dialog 一些问题 局中滚动

    .el-dialog { position: absolute; top: 50%; left: 50%; margin: 0 !important; transform: translate(-50 ...

  9. C++复制初始化的限制

    相比于直接初始化,复制初始化有更加严格的限制. 1:在复制初始化时,不能使用声明为explicit的构造函数进行的隐式转换.而直接初始化则是允许的: struct Exp { explicit Exp ...

  10. CSS Specificity

    CSS的specificity特性或称非凡性,它是一个衡量CSS值优先级的一个标准. 其实就是解决冲突,当同一个元素被CSS选择符选中,按照优先权取舍不同的CSS规则. specificity用一个四 ...