一. 常见线程池

线程池的创建方法主要有两类,第一是通过Executors 创建线程池,第二是通过 ThreadPoolExecutor 创建线程池。

首先我们来看通过Executors 创建的线程池是什么样的

1. Executors.newFixedThreadPool:创建⼀个固定大小的线程池,特点是核心线程数等于最大线程数,可控制并发的线程数,超出的线程会在有界队列中等待;
        2. Executors.newCachedThreadPool:创建一个可缓存的线程池,特点是核心线程数为0,队列采用了SynchronousQueue,没有线程来take,任务不能put进去,若线程数超过处理所需,缓存⼀段时间后会回收,若线程数不够,则新建线程;
        3. Executors.newSingleThreadExecutor:创建单个线程数的线程池,它可以保证先进先出的执行顺序;
        4. Executors.newScheduledThreadPool:创建⼀个可以执⾏延迟任务的线程池;
        5. Executors.newSingleThreadScheduledExecutor:创建⼀个单线程的可以执行延迟任务的线程池;
        6. Executors.newWorkStealingPool:创建⼀个抢占式执行的线程池(任务执行顺序不确定)【JDK1.8 添加】。

一般不推荐使用Executors 的方式去创建线程池,而是通过ThreadPoolExecutor 根据项目实际去设置参数创建线程池,下面我们主要分析一下线程池核心参数的设置。

二. 线程池参数设置详解

在这个问题展开前,我们先来了解一下压测,即压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和和可能存在的隐患。

压测的目的就是通过模拟真实用户的行为,测算出机器的性能(单台机器的 QPS、TPS),从而推算出系统在承受指定用户数(100 W)时,需要多少机器能支撑得住。因此在进行压测时一定要事先设定压测目标值,这个值不能太小,也不能太大,按照目前业务预估的增长量来做一个合理的评估。

压测的一些名词解释:

首先,我们线程池的参数设置最后必须要通过压测来确定,需要符合我们的业务需求。那么我们如何开始进行压测参数配置的,也就是说压测前我们线程池的参数应该如何选取,这个问题需要分情况去讨论:

情况一:当前的线程池可以占用我们服务器的所有资源

基于先辈程序员的理论基础和实践,进行线程池的参数合理调整,然后经过压测,最终确定我们的参数。

例如:

  1. 计算密集型:CPU核数 + 1
  2. IO密集型:2 * CPU核数  or  CPU利用率 * (1 + 等待时间 / 计算时间)* CPU核心数

情况二:当前线程池不可以使用机器的所有资源

由于我们目前机器不是单机部署的,分布式部署的情况,一个服务多个接口的情况,比如两个重要接口,三个可降级的接口,在这个场景下比如说一个重要接口里面需要创建一个线程池来提高单接口的处理速度,那么这个时候怎么去设置参数。也就是说,我这个线程池不能获得服务器的所有资源。

具体案例:需要拿到该服务各个接口的访问比例,比如4个接口,各个比例为 2 : 3 :1 : 1

两个核心服务接口(承载60%+)

A. 需要创建线程池,提高单接口处理速度,这时候怎么设置线程池参数(最核心的三个参数:最大线程数,核心线程数以及阻塞队列的选择)

  1. 第一个接口访问量占用 1  / 4:因此分配1/4的资源
  2. 第二个接口访问比例 3 / 8:因此分配 3/8 的资源
  3. 接下来确定最大线程数(贴合实际):不能随意的将一个线程池线程数加大,这样的话会导致其他接口不能雨露均沾,具体情况考虑CPU核数,所有接口的最大QPS,和本机活跃的live的线程数。拿到这些数据后再通过上述访问比例去分配资源。
  4. 核心线程数:初次压测设置成为一样大,测试最大并发访问的情况。撑得住,调小核心线程数。撑不住,我们还有一个阻塞队列去调整,接下来去确定阻塞队列
  5. 不推荐无界队列:使用无界队列相当于干掉了最大线程数这个参数,违背了线程池的设计初衷,还有无限积压请求,最终导致OOM问题。推荐使用有界队列:不推荐直接使用Integer.max_value,而是模拟我们访问量最大的场景来确定,将高峰访问时段与我们压测进行匹配具体参数设置:(这个时段的访问数量  减去  这个时段接口能处理的请求数量)* 150%,也就是用我们接口能处理请求后剩余的值适当提升50%作为我们有界队列的上限。
  6. 设置完后进行压测

B. 案例情况:如果按照上述条件调整了,还没达到预期怎么办?

  1. 已经达到最大线程数3/8了,那就调大队列的最大等待数(首先调整队列而不是线程数)。好处:不影响其他接口当前线程只是等待,而不是不可用
  2. 如果,业务方不同意上述等待方案:优化当前接口代码,把并发性调整一下,调高。
  3. 线程数适当再调大一点,但是不能再多很多了,否则会影响其他接口
  4. 添加机器

案例情况:如果线程核数设置不合理,会产生什么问题?

  1. 接口线程池设置太小,接口异常请求数量增多:如果使用抛异常降级策略,将会导致有大量的异常日志。会造成接口熔断或者降级(非正常性质的),导致生产事故。
  2. 接口线程池设置太大:当前接口活得挺好,但是会挤兑其他接口的资源,其他接口没有足够的资源,导致系统接口积压,系统崩溃。

总结:

  1. 先按照接口请求比例设置占用最大线程数
  2. 按照压测情况,适当设置核心线程数
  3. 按照最大情况,留出一定的等待队列阈值
  4. 饱和策略:按照具体情况具体分析

线程池的创建及参数设置详解相关推荐

  1. 多线程中线程池常见7个参数的详解以及执行流程

    一 线程池常见参数 1.1 概念 1.2 7个参数说明 7个参数: int corePoolSize, 常驻线程数量(核心) int maximumPoolSize,最大线程数量 long keepA ...

  2. 如何用PPT来实现三维3D效果,附参数设置详解

    原文链接: 如何用PPT来实现三维3D效果,附参数设置详解

  3. 海康工业相机SDK + OpenCV实例(4):相机参数设置详解

    海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 文章目录 海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 前言 一.相机参数基本接口 二.自动曝光时间调整亮度 ...

  4. 变频器调试过程中的常用参数设置详解

    变频器调试过程中的常用参数设置详解 变频器的设定参数较多,每个参数均有一定的选择范围,使用中常常遇到因个别参数设置不当,导致变频器不能正常工作的现象.因此,变频器调试是从正确设置变频器参数开始的.以下 ...

  5. 【多线程】线程池的创建和参数设定

    为什么要使用线程池 在日常开发中为了提高代码运行效率,或多或少会用线程去执行异步任务,线程的创建和销毁是需要占用一定资源的. 首先我们看一下一个线程的创建步骤: 为线程堆栈分配和初始化大量内存块 需要 ...

  6. 深入剖析线程池基本原理以及常见面试题详解

    文章目录 面试官:能给我讲讲线程池的实现原理? 线程池类继承关系 ThreadPoolExecutor 核心数据结构 面试官:给我讲讲线程池的有哪些参数? 面试官:如何优雅的关闭线程? 线程的生命周期 ...

  7. x264参数设置详解(x264 settings)

    ---------------------  作者:yue_huang  原文:https://blog.csdn.net/yue_huang/article/details/79309696 参数使 ...

  8. Kafka Producer 参数设置详解

    主要介绍下kafka的producer配置参数,只取了其中的一部分常用的,后续的有时间,也会补充一些,更多的详细参数,可以参考<kafka官网>,参数的内容,主要是选取<apache ...

  9. 线程池框架_Java并发——Executor框架详解(Executor框架结构与框架成员)

    一.什么是Executor框架? 我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等.线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从JDK1 ...

最新文章

  1. 程序员的幸福:上个月被裁拿赔偿,这个月找到涨薪50%的工作
  2. 使用RBTool自动提交code review请求
  3. python笔记-排序函数
  4. oracle10g sys密码忘记,Oracle 10g忘记system,sys密码的解决办法。
  5. mysql hicharts_PHP怎么调用Mysql的数据给Highcharts
  6. 递归_三要素_基础算法必备
  7. BDTC 2019 | 15场分论坛,10分钟速览,5折票优惠,烧脑模式开启
  8. Axure RP Pro - 翻译 - Download下载 - Axure RP Pro 5.5.0.1955
  9. STM32--MPU内存保护单元(二)
  10. 定义一个Employee类并排序(完整版本)
  11. 打造自己的VC++ 6.0免安装简版
  12. 思科模拟器cisco模拟器
  13. 2020年中国医药冷链物流行业市场现状分析,行业步入发展快车道「图」
  14. matlab 梳妆函数,梳状函数.PPT
  15. 计算机休眠后无法唤醒出现蓝屏,电脑休眠后无法唤醒怎么办【解决方法】
  16. mac系统使用wireshark抓取无线网卡数据包以及常用过滤条件
  17. 全国计算机等级考试python(未来教育 刷题软件)
  18. 【滤波器】各种滤波器的理解与学习
  19. u盘插电脑计算机卡了,为什么u盘一连接电脑就卡_电脑一连接u盘就卡的处理办法...
  20. Quartus2的实验常用元件

热门文章

  1. ShopXO开源电商系统源码支持PC+H5支付宝小程序微信小程序百度小程序头条amp;抖音小程序QQ小程序APP等
  2. 华师大网络学院计算机,华师大网络学院计算机原理作业.doc
  3. 学习参考《父与子的编程之旅python【第二版】》高清中文版PDF+高清英文版PDF+源代码...
  4. 行列式因子、不变因子、初等因子、smith标准型、Jordan标准型、最小多项式的matlab实现
  5. 重来之大学版|学习篇-为什么要学习?为什么要终身学习?别一上来就“费曼学习法”,先学习学习再学习
  6. Vue整合ElementUI
  7. lenov0微型计算机,联想ThinkBook 14s锐龙版评测:7nm锐龙加持,职场实力担当
  8. 2000-2019年世界人口数据集内附下载地址和链接
  9. 7-10 公路村村通 (最小生成树Prim算法) | PTA数据结构与算法——C语言实现
  10. npm 实战精讲-曾亮-专题视频课程