线程池究竟设成多大是要看你给线程池处理什么样的任务,任务类型不同,线程池大小的设置方式也是不同的。

任务一般可分为:CPU密集型、IO密集型、混合型,对于不同类型的任务需要分配不同大小的线程池。

  • CPU密集型任务

尽量使用较小的线程池,一般为CPU核心数+1。
因为CPU密集型任务使得CPU使用率很高,若开过多的线程数,只能增加上下文切换的次数,因此会带来额外的开销。

  • IO密集型任务

可以使用稍大的线程池,一般为2*CPU核心数。
IO密集型任务CPU使用率并不高,因此可以让CPU在等待IO的时候去处理别的任务,充分利用CPU时间。

  • 混合型任务

可以将任务分成IO密集型和CPU密集型任务,然后分别用不同的线程池去处理。
只要分完之后两个任务的执行时间相差不大,那么就会比串行执行来的高效。
因为如果划分之后两个任务执行时间相差甚远,那么先执行完的任务就要等后执行完的任务,最终的时间仍然取决于后执行完的任务,而且还要加上任务拆分与合并的开销,得不偿失

  • 对于计算密集型的程序,线程数应当等于核心数,但是再怎么计算密集,总有一些IO吧,所以再加一个线程来把等待IO的CPU时间利用起来
  • 对于计算密集型的任务,在拥有N个处理器的系统上,当线程池的大小为N+1时,通常能实现最优的效率。(即使当计算密集型的线程偶尔由于缺失故障或者其他原因而暂停时,这个额外的线程也能确保CPU的时钟周期不会被浪费。)

最新文章

  1. VS2013菜单栏文字全大写的问题
  2. Android一体式(沉浸式)状态栏的实现
  3. jiulianhuan 快速幂--矩阵快速幂
  4. MVC ActionResult JsonResult
  5. Counting Bits
  6. Codeforces Beta Round #69 (Div. 1 Only) C. Beavermuncher-0xFF 树上贪心
  7. HDU4524+水题
  8. java实现window phone推送通知
  9. java.lang.NullPointerException: Attempt to invoke virtual method 'void 、Handler.removeMessages(int)' on a null object reference
  10. Android应用开发性能优化完全分析
  11. UART RS232 的CTS与RTS
  12. HIBERNATE 入门小案例
  13. Facebook和Google如何激发工程师的创造力
  14. 一个商品练习的py
  15. ui的设计原则
  16. Lucene学习之CURD
  17. FreeBSD 系统的配置.
  18. 画流程图挺好的软件---visio
  19. SpringMVC(4.1):Controller接口控制器详解(1)
  20. Light OJ 1199:Partitioning Game(SG函数模板)

热门文章

  1. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較类似。
  2. ios中Pldatabase的用法(2)
  3. rename系统调用的实现浅析
  4. 【RS】Local Low-Rank Matrix Approximation - LLORMA :局部低秩矩阵近似
  5. servlet 让浏览器输出中文,并成功打印出来.2种方法
  6. MyBatis---使用MyBatis Generator生成Dto、Dao、Mapping
  7. [aaronyang原创] Mssql 一张表3列的sql面试题,看你sql学的怎么样
  8. MongoDB学习笔记(11)-- Index
  9. 跟我学SharePoint 2013视频培训课程——自定义网站导航(4)
  10. PMD-Java 代码检查工具对 error 和 warning 的配置