java线程池 队列满_线程池为什么设计为队列满+核心线程数满了才创建新线程?而不是队列积压一定阈值的时候创建新的线程?...

这个只是一种设计思路,并不是说,就只能这样设计。设计成你说的积压一定阈值的时候创建新的线程也是可以的,但是无论什么设计,都是要理解原理才能发挥最大性能使用。

我觉得主要要搞清楚两个问题:为啥要区分核心线程数和最大线程数?为啥要有任务队列?最后可以简单纠结下为啥要第一阶段队列满+核心线程数满才创建线程?而不是队列积压一定阈值的时候创建新的线程?

Java 线程池设计的思路主要是:

一个任务从被提交到线程池执行共经历以下流程:线程池判断核心线程池里是的线程是否都在执行任务,如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下一个流程

线程池判断工作队列是否已满。如果工作队列没有满,则将新提交的任务储存在这个工作队列里。如果工作队列满了,则进入下一个流程。

线程池判断其内部线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。如果已满了,则交给饱和策略来处理这个任务。

为啥要区分核心线程数和最大线程数:业务是有高峰和低谷的,低谷的时候没必要用那么多线程,高峰的时候需要更多线程处理任务。CPU上下文切换,维护线程状态等等都是有损耗的,目前大多是基于云服务虚拟化的微服务多进程环境:

你很难确定究竟什么时候哪个进程会忙,哪个进程会比较闲,如果都采用同样的线程池大小,耗费了更多资源,会导致CPU切换增多。

为啥要有任务队列:第一是为了提供从核心线程数,转变成最大线程数提供了一个缓冲,不至于任务一多就轻易创建线程。创建线程是有损耗的,并且损耗很大

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值