背景

首先先明确一下线程池的主要作用是什么
线程池解决的核心问题就是资源管理问题。在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。这种不确定性将带来以下若干问题:

  1. 频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大。创建一个线程不仅会消耗内存资源,并且会增加CPU的线程的上下文切换频繁,当线程达到一定的极限的时候CPU就只能忙的切换线程,而其他什么事情也不做了。
  2. 对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险。当我们无限的去申请线程的时候就有可能产生OOM等问题
  3. 系统无法合理管理内部的资源分布,会降低系统的稳定性。比如说我们的mysql有自己的池,我们的redis也有自己的池。还比如我们使用的队列消费也有自己的池。这也就是一种安全隔离
  4. 那就是快速的处理请求,一个人工作怎么有多个人工作快呢?这里也牵扯到一个多人合作的配合问题,也就是线程线程的切换问题,我们都知道Java语言的线程切换方式采用的是抢占式,意思就是由系统来分配资源。线程太多的时候系统就会有忙不过来的情况。

我们如果使用Java语言的话,我们来分析一下Java线程池。

Java中的ThreadPoolExecutor

理论上线程池的参数设置情况

  1. 理论必定只是理论,到真实的场景中我们的目的性是不一样的。有的是追求快,有的时候机器资源很充足,有的是追求稳的。
  2. 所以在设置线程池的时候我们还是确定一个最后权重比较大的目标去设置。

线程池的目的我们也知道了,大概设置的基础理论也清楚了。看看美团技术团队给的两个场景。

快速响应用户请求

描述:用户发起的实时请求,服务追求响应时间。比如说用户要查看一个商品的信息,那么我们需要将商品维度的一系列信息如商品的价格、优惠、库存、图片等等聚合起来,展示给用户。

分析:从用户体验角度看,这个结果响应的越快越好,如果一个页面半天都刷不出,用户可能就放弃查看这个商品了。而面向用户的功能聚合通常非常复杂,伴随着调用与调用之间的级联、多级级联等情况,业务开发同学往往会选择使用线程池这种简单的方式,将调用封装成任务并行的执行,缩短总体响应时间。另外,使用线程池也是有考量的,这种场景最重要的就是获取最大的响应速度去满足用户,所以应该不设置队列去缓冲并发任务,调高corePoolSize和maxPoolSize去尽可能创造多的线程快速执行任务。

总结:将核心线程数和最大线程数设置到最大。这里的最大也就是我们在不影响其他接口或业务的情况下,还有就是机器资源OK的情况下。现在我们的机器都是分布式,在CPU或内存超过某一个阀值的时候就会自动扩容弹机器。还有就是队列的使用,也就是看你用户的峰值会有多少,设置一个有界队列当突然流量,比如100个同时请求,这个时候我们的系统最大承受能力是80个线程数,哪我们就设置个核心线程数设置的是20个,那么我们就搞100。个大小容量的队列。然后避过这个高峰我们的线程继续去消费。但是在我们目前这种场景是不设置队列的。设置位0,因为用户对等待是零容忍的。

快速处理批量任务

描述:离线的大量计算任务,需要快速执行。比如说,统计某个报表,需要计算出全国各个门店中有哪些商品有某种属性,用于后续营销策略的分析,那么我们需要查询全国所有门店中的所有商品,并且记录具有某属性的商品,然后快速生成报表。

分析:这种场景需要执行大量的任务,我们也会希望任务执行的越快越好。这种情况下,也应该使用多线程策略,并行计算。但与响应速度优先的场景区别在于,这类场景任务量巨大,并不需要瞬时的完成,而是关注如何使用有限的资源,尽可能在单位时间内处理更多的任务,也就是吞吐量优先的问题。所以应该设置队列去缓冲并发任务,调整合适的corePoolSize去设置处理任务的线程数。在这里,设置的线程数过多可能还会引发线程上下文切换频繁的问题,也会降低处理任务的速度,降低吞吐量。

总结:这里的话我们会看到这个是一个稳定的请求过程,不会出现突然的猛增等情况,所以我个人认为在机器资源充分的情况下可以不设置队列,但是就如上文所说,尽量多的并发充分利用资源,所以说这里的话可以使用队列做一个临时缓冲做准备的地方,那我的理解就是,机器资源只有那么多设置的核心线程数和最大线程数不能满足这些大量的请求,但是我又不想让这些请求被拒绝,所以我开个缓冲队列来进行缓冲消费。

总结

  1. 线程池的作用
  2. 线程池理论参数设置参考
  3. 场景分析

参考

美团技术团队-Java线程池实现原理及其在美团业务中的实践

matlab 设置最大并行数_浅析线程池参数设置相关推荐

  1. java线程池参数_java线程池参数设置原则,如何设置线程池参数比较合理?

    线程池的参数应该怎样设置呢?相信对于很多的人来说这也是一个比较难的问题,下面就让我们一起来解决一下,究竟应该如何设置线程池的参数才是最合理的吧! 首先在设置参数的时候,有以下的几点是我们需要考虑到的! ...

  2. tomcat 查看当前请求数_原生线程池这么强大,Tomcat 为何还需扩展线程池?

    前言 Tomcat/Jetty 是目前比较流行的 Web 容器,两者接受请求之后都会转交给线程池处理,这样可以有效提高处理的能力与并发度.JDK 提高完整线程池实现,但是 Tomcat/Jetty 都 ...

  3. 【并发编程】线程池参数设置与动态调整

    看了美团的一篇技术文章后才知道原来线程池的参数还可以动态调节. 一.场景分析 1.1 一个线程池中的线程异常了,那么线程池会怎么处理这个线程? public class ThreadPoolExecu ...

  4. ThreadPoolExecutor线程池参数设置

    一.ThreadPoolExecutor的重要参数 corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处 ...

  5. 线程池大小设置,CPU的核心数、线程数的关系和区别,同步与堵塞完全是两码事

    线程池应该设置多少线程合适,怎么样估算出来.最近接触到一些相关资料,现作如下总结. 最开始接触线程池的时候,没有想到就仅仅是设置一个线程池的大小居然还有这么多的学问,汗颜啊. 首先,需要考虑到线程池所 ...

  6. 线程池大小设置和CPU核心数的关系

    文章目录 1.线程池和CPU核心数的关系 2.常见概念:CPU的核心数,CPU的线程数 3.是否使用线程池就一定比使用单线程高效呢? 1.线程池和CPU核心数的关系 一般说来,大家认为线程池的大小经验 ...

  7. java线程池大小_线程池大小设置多少合适?java如何合理设置线程池大小?

    在连接数据库时我们经常会用到线程池,而有时候我们就会烦恼,线程池的大小究竟该设置成多大才合适呢?小伙伴们知道要如何合理设置线程池大小吗?下面跟小编一起来看看吧. 一般来说,我们线程池究竟设置多大是基于 ...

  8. python3 ThreadPoolExecutor 线程池大小设置

    线程池的理想大小取决于被提交任务的类型以及所部署系统的特性.线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的CPU和内存资源上发生竞争,这不仅会导致更高的内存使用量,而且还可能 ...

  9. 线程池传递对象参数_一次线程池参数错误引起的线上故障

    在JAVA里,我们通常会把没有前后依赖关系的逻辑操作扔到多个线程里并行执行,以提高代码运行效率. 同时,我们一般也不会单独显式创建线程,而是通过线程池设置线程.使用线程池的好处是减少在创建和销毁线程上 ...

最新文章

  1. iphone退款申请教程_王者荣耀账号注销退钱吗?王者荣耀账号注销100%退款教程...
  2. 静态反调试技术(2)
  3. linux技术理解,技术|理解 Linux 链接(二)
  4. 安装Vuecli新版本正常,但是显示版本是低版本
  5. php乱码调试,NotePad++ 调试PHP代码中文显示乱码
  6. 国内首家,每周到岗上班3天,携程率先推出“3+2”混合办公模式
  7. 教你 Shiro + SpringBoot 整合 JWT
  8. 003《区块链开发指南》一一1.2 区块和区块链 转
  9. HTML和CSS是什么玩意儿
  10. flex 实现图片播放 方案二 把临时3张图片预加载放入内存
  11. linux物理服务器搬迁后,更换了路由器,ping不同外网
  12. HTML5网页设计盒子模型-内容+padding+boder+margin
  13. 最细致全面架设单机传奇教程
  14. HTML5+CSS3小实例:炫彩流光圆环加载动画
  15. Unity Fingers Gesture手势插件教程(新)
  16. shell执行curl_Linux curl命令详解
  17. 题目内容: 班级第一次列队,通常老师会让同学按身高排成一列,然后1、2报数,喊到1的同学向前一 步,就这样,队伍就变成两列了。假设现在一个班级有n个同学,并且他们已经按身高排成 了一列,同学按身高从1
  18. 小米机器人 尘盒配件_小米机器人怎么取出尘盒
  19. 使用eclipse或者myeclipse时,鼠标变成黑色十字架解决办法
  20. 解决mmdetection训练过程loss为nan的问题

热门文章

  1. 词云制作 Python
  2. Python编程基础:第一节 变量Variables
  3. 各个大厂的机器学习平台概述
  4. Ten ways to improve the performance of large tables in MySQL--转载
  5. RPC调用框架比较分析--转载
  6. nginx多进程模型之配置热加载---转
  7. 机器学习算法基础——决策树和随机深林
  8. __attribute__((packed))
  9. 直击CVPR2017:商汤科技打造技术盛宴23篇论文刮起中国风 By 机器之心2017年7月25日 10:14 近日,CVPR2017 在夏威夷如火如荼地进行,作为全球计算机视觉顶级会议,CVPR
  10. 谷歌深度学习四大教训:应用、系统、数据及原理(附数据集列表)