ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多线程 - 如何合理配置线程池

2020-09-13 22:34:14  阅读:421  来源: 互联网

标签:执行 队列 合理配置 任务 线程 密集型 多线程 CPU


总结

根据“任务的性质”分析

CPU 密集型任务

  • 和内存打交道,大量计算。例如大数的计算,正则匹配
  • 如何配置:CPU 密集型任务应配置尽可能小的线程,如配置 Ncpu+1 个线程的线程池(Ncpu 是处理器的核的数目)。如果线程太多,会造成线程在CPU内部的上下文切换。。CPU的线程上下文切换比指令执行耗时的更多。

IO 密集型任务

  • 解释:和磁盘,网络,文件,数据库交互很多的。
  • 如何配置:由于 IO 密集型任务线程并不是一直在执行任务,不会经常在CPU内切换线程上下文,则应配置尽可能多的线程,如 2*Ncpu。
    • 对于 IO 型的任务的最佳线程数,有个公式可以计算 Nthreads = NCPU * UCPU * (1 + W/C)

      ❑NCPU 是处理器的核的数目

      ❑UCPU 是期望的 CPU 利用率(该值应该介于 0 和 1 之间)

      ❑W/C 是等待时间与计算时间的比率。等待时间与计算时间我们在 Linux 下使用相关的 vmstat 命令或者 top 命令查看。

混合型任务

  • 解释:前两者的混合
  • 如何配置:如果可以拆分,将其拆分成一个 CPU 密集型任务和一个 IO 密集型任务。
    • 只要这两个任务执行的时间相差不是太大,那么分解后执行的吞吐 量将高于串行执行的吞吐量。
    • 如果这两个任务执行时间相差太大(例如:一个是常量时间,一个是正无穷),则没必要进行分解。
    • 可以通过 Runtime.getRuntime().availableProcessors()方法获得当前设备的 CPU 个数。

 

 

根据“任务的优先级”分析

优先级不同的任务可以使用优先级队列 PriorityBlockingQueue 来处理。它可 以让优先级高的任务先执行。

 

根据“任务的执行时间”分析

执行时间不同的任务可以交给不同规模的线程池来处理,或者可以使用优先 级队列,让执行时间短的任务先执行。

 

根据“任务的依赖性(依赖数据库连接)”分析

依赖数据库连接池的任务,因为线程

标签:执行,队列,合理配置,任务,线程,密集型,多线程,CPU
来源: https://www.cnblogs.com/frankcui/p/13663801.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有