线程池七大核心参数

线程池七大核心参数的作用 线程池七大核心参数

corePoolSize(核心线程数) 功能:线程池必须始终有这么多线程。
例如,如果将其设置为 5 ,则池中必须有 5 个线程。
如果池中的线程少于5 个,即使有空闲线程,池也必须拉出一个新线程来工作,任务不会先排队。
在我之前的项目中,这个东西设置得很低。
导致高峰期任务总是排队,用户焦急等待。

maximumPoolSize(最大线程数) 功能:池可以打开的最大线程数。
核心线程加上临时紧急线程,仅此而已。
例如,如果 corePoolSize 为 5 并且 max 为 1 0,则池最多可以有 1 0 个线程。
如果线程数达到1 0并且队列已满,则忘记下一个任务并拒绝它。
上次更改此参数时,我突然将 max 设置为很高的值,服务器 CPU 增加到 1 00%。
后来我意识到我忘了调整队列大小。

keepAliveTime(线程非活动生存时间) 功能:空闲线程需要多长时间才能跑掉而没有工作可做?如果超过这个时间没有任务,多余的线程将被终止。
比如设置为1 秒,如果超过1 秒没有做任何工作,临时开启的线程就会丢失。
这样可以节省一些资源。
当时我不明白为什么要这样设置,后来通过测试发现,如果设置太短,线程会老化,会消耗很多钱。

单位(时间单位) 功能:keepAliveTime的时间单位。
秒、毫秒之类的。
例如keepAliveTime设置为6 0,单位为TimeUnit.SECONDS,即6 0秒。
别把这件事搞错了。
如果设置为毫秒,可能需要半天才能响应。

workQueue(任务队列) 功能:任务必须先在这里排队。
例如,如果核心线程满了,新的任务就会放在这里等待。
常见的有LinkedBlockingQueue和SynchronousQueue。
上次使用LinkedBlockingQueue时,忘记设置容量了。
结果队列爆炸了,新任务直接报错。
后来SynchronousQueue被改了。
这件事很简单。
当有任务到来时,就启动一个线程,队列基本没什么用处。

线程工厂 效果:新线程必须从这里创建。
如果你想在线程库中新开一个线程,就去找它。
你可以自定义这个,比如给线程命名,设置优先级等。
在我之前的项目中,我用这个给线程添加LOG标签,这样可以很容易发现问题。

handler(拒绝处理策略) 功能:队列已满,新任务怎么办。
有几种策略:AbortPolicy直接爆炸,CallerRunsPolicy允许任务在原来的线程中完成,DiscardPolicy直接丢弃,DiscardOldestPolicy丢弃最旧的。
上次我使用 DiscardPolicy 时,用户抱怨任务不断丢失。
然后我将其更改为 CallerRunsPolicy。
虽然调用线程会慢一些,但至少任务不会丢失。

线程池七大参数

核心线程数:线程池中常驻线程的数量。
除非allowCoreThreadTimeOut 为true,否则它们在空闲时不会被销毁。

最大线程数:线程池中同时运行的最大线程数。
当队列已满时,就会创建线程。
这个数字不能超过这个数字。

空闲线程生存时间:空闲冗余线程等待新任务的最长时间,超时后终止,以减少资源消耗。

时间单位:keepAliveTime的时间单位,例如:例如。
毫秒和秒。

任务队列:保存未执行的任务。
当核心线程繁忙时,新任务会排队等待。

线程工厂:创建新线程的工厂。
可以自定义线程名称、优先级等。

拒绝策略:当队列已满且线程数达到最大值时,会触发新的任务策略,例如: B.AbortPolicy,抛出异常。

使这些参数适应应用场景和要求。

线程池七大核心参数

核心线程数:启动时保持活动状态的基本线程数。

最大线程数:高峰期的最大扩展数,以应对高负载。

线程生存时间:非核心线程在空闲的情况下需要多长时间被杀死。

任务队列:存储任务的地方。
选择正确的队列非常有效。

线程优先级:高优先级的任务先执行。

跳出策略:任务满时如何处理以避免系统崩溃。

线程工厂:自定义线程属性并精细化管理。