在高并发的情况下采用线程池,有效的降低了线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换)

那么在高并发的情况下,我们怎么选择最优的线程数量呢?选择原则又是什么呢?这个问题去哪网的技术总监问过我,这里总结一下。

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

对于计算密集型的任务,在拥有N个处理器的系统上,当线程池的大小为N+1时,通常能实现最优的效率。(即使当计算密集型的线程偶尔由于缺失故障或者其他原因而暂停时,这个额外的线程也能确保CPU的时钟周期不会被浪费。- 摘自《Java Concurrency In Practise》

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

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

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

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

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

线程池如何确定线程数量相关推荐

  1. 【Java面试小短文】当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?

    欢迎关注Java面试系列,不定期更新面试小短文.欢迎一键三连! 当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务? 当我们提交一个任务到线程池,它的工作原理如下: ...

  2. 线程池:治理线程的法宝

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Oo鲁毅oO juejin.im/post/5e1b1fcc ...

  3. 【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )

    文章目录 一.线程池阻塞队列 二.拒绝策略 三.使用 ThreadPoolExecutor 自定义线程池参数 一.线程池阻塞队列 线程池阻塞队列是线程池创建的第 555 个参数 : BlockingQ ...

  4. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  5. 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )

    文章目录 一.线程池中的 Worker ( 工作者 ) 二.线程池中的工作流程 runWorker 三.线程池任务队列中获取任务 getTask 在博客 [Android 异步操作]线程池 ( 线程池 ...

  6. 【Android 异步操作】线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTask 使用线程池示例 )

    文章目录 一.线程池简介 二.线程池初始化方法简介 三.线程池使用示例 一.线程池简介 线程池一般是实现了 ExecutorService 接口的类 , 一般使用 ThreadPoolExecutor ...

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

    线程池数据结构与线程构造方法 由于已经看到了ThreadPoolExecutor的源码,因此很容易就看到了ThreadPoolExecutor线程池的数据结构.图1描述了这种数据结构. 图1 Thre ...

  8. 线程池的使用(线程池重点解析)

    我们有两种常见的创建线程的方法,一种是继承Thread类,一种是实现Runnable的接口,Thread类其实也是实现了Runnable接口.但是我们创建这两种线程在运行结束后都会被虚拟机销毁,如果线 ...

  9. 自定义线程池内置线程池的使用 ThreadPoolExecutor和Executorservice 示例与注意事项

    文章目录 线程池介绍 自己设计一个线程池 1.设计ThreadPool类: 2.设计工作队列 3.实现自己设计的线程池 用java的ThreadPoolExecutor自定义线程池 自定义线程池-参数 ...

  10. Java多线程之线程池配置合理线程数

    Java多线程之线程池配置合理线程数 目录 代码查看公司服务器或阿里云是几核的 合理线程数配置之CPU密集型 合理线程数配置之IO密集型 1. 代码查看公司服务器或阿里云是几核的 要合理配置线程数首先 ...

最新文章

  1. java xlsx读写_Java读写Excel
  2. python计算短时自相关函数 音频信号_librosa与python_speech_features
  3. Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅
  4. 写给即将离开校园准备进入 SAP 研究院实习的朋友
  5. .NET Core项目从xproj+project.json向csproj迁移简介
  6. 【算法分析与设计】最大连续子序列和问题
  7. python 百度网盘下载提速_教你如何百度网盘的提高下载速度?
  8. VC对话框界面如何调整静态文本字体和大小?(转载)
  9. linux使用gcc编译报错“undefined reference to `pthread_create'”
  10. 实训作业 4(界面2)
  11. 如何对MacBook上坏掉的USB-C接口进行故障排除?
  12. android wakelock权限,android - 当我使用PowerManager.WakeLock与AlaramManager android时的权限异常 - 堆栈内存溢出...
  13. 如何写一个脚本(附送一个脚本)
  14. 计算机科学顶尖期刊,重磅!中国各学科顶级期刊名单发布!(影响力指数排名)...
  15. 计算机英语输入法怎么,电脑英文输入法不见了怎么处理?
  16. 电商行业如何投放UC头条信息流广告?UC广告投放的扣费模式
  17. 使用jstack查看线程
  18. 齐次坐标得到非齐次坐标
  19. 解一元三次方程方程问题细节探讨
  20. Effective C++ Third Edition 读书笔记 3

热门文章

  1. 大型网站应用中 MySQL 的架构演变史
  2. spring4笔记----spring生命周期属性
  3. Scala的那些匿名函数
  4. 强大命令——Ping命令总结
  5. 我的家庭私有云计划-20
  6. 1.中小型企业通用自动化运维架构 -- 自动化运维流程
  7. 12.TCP/IP 详解卷1 --- 广播和多播
  8. 9.1 Zend_Json
  9. 79. 基于 PHP 的用户认证
  10. 一个GUI程序究竟会有几个线程?