创建线程池的几个核心构造参数

哎,回想起第一次接触Java线程池的时候,真是不知所措。
那时我还在一家互联网公司做项目。
我记得那是2 01 6 年,项目请求很多,服务器压力很大,所以领导让我优化线程使用。

当时我就觉得线程池看起来很先进,肯定能帮助我们提高效率。
所以我开始了我的研究。
我当时还年轻,只是想在开始做之前先自己弄清楚。
我花了几天时间才理解ThreadPoolExecutor类。

我记得将 corePoolSize 设置为 1 0,认为应该足够了。
结果启动项目后发现线程池的线程数一直保持在1 0个,根本没有增加。
当时我以为我设置错了,但是查资料发现我也设置了maximumPoolSize为1 0,所以线程数不会超过这个值。

还有一次,项目中有一个任务特别重。
结果,线程池中的所有线程都饱和了,工作队列也满了。
当时我不知道有什么解决办法,所以我只是看着任务堆积起来。
后来,我的老板告诉我,我需要实施适当的拒绝政策。
这时我才知道有一个 CallerRunsPolicy 允许任务在调用线程中运行,这减轻了压力。

我们来谈谈工作队列。
我当时正在使用LinkedBlockingQueue。
事实证明,随着任务数量的增加,性能会下降。
后来换成ArrayBlockingQueue,性能好了很多。

总之,创建线程池时一定要根据自己的需求来设置参数,不能一概而论。
比如线程工厂和拒绝策略,我没接触过这方面,不敢乱说,这个需要根据实际情况来确定。
记得曾经有一个同事想要定制线程工厂,但是花了很长时间没有成功。
后来我帮忙解决了这个问题。

嘿,一说起这个我就哭了。
现在想来,当时的我真是一个失败者。
但也正是因为这些坑,让我现在对线程池有了更深入的了解。

线程池的7大参数是什么

2 02 2 年,我在某个项目中遇到了性能瓶颈,当时正在研究线程池。
我当时就无语了。
为什么这个线程池里有这么多参数呢?光是看着这个我就头疼。
首先我想统计主线程数和最大线程数。
我明白这一点。
核心线程的数量意味着池中应该始终有这么多的活动线程。
即使他们不活动,在时间到了之前也不会被允许离开。
最大线程数是池中可以存在的最大线程数,包括核心线程和非核心线程。

再看,我对被动存在的时间感到困惑。
这意味着那些非核心线程如果保持不活动状态的时间超过这个时间,就会被回收。
那个时间单位是用来描述空闲生存时间单位是什么的,是秒还是毫秒。
我能理解这一点。

然后是工作队列。
这很重要。
用于放置尚未执行的任务。
这应该是一个阻塞队列。
你不能直接将它送入其中,你必须将其排队。
ArrayBlockingQueue、LinkedBlockingQueue,这些都很常见。

然后是线程工厂。
我后来意识到了这一点。
原来是用来做线的。
您可以自定义线程的属性,例如名称、优先级以及是否为守护线程。
这些都可以定制。

最后是拒绝策略,这是最麻烦的,因为任务太多,队列已满,线程达到上限。
已经到了。
此时,必须制定策略来处理这些新任务。
AbortPolicy就是直接抛出异常; CallerRunsPolicy的目的是让提交任务的线程自己处理; DiscardOldestPolicy 丢弃最旧的任务; DiscardPolicy就是直接丢弃新任务。

这七个参数是相互关联的。
基本线程的数量是基础。
首先处理作业。
如果作业无法处理,它们将被添加到队列中。
当队列满时,将创建非核心线程。
直到达到最大线程数,仍然无法处理,才应该引入拒绝策略。
一旦这个非核心线程的空闲时间到期,就应该回收它以节省资源。
当时我很困惑,但渐渐地我明白了。

请简述线程池的核心爱参数及其作用,以及合理配置线秤池参数需要考虑的主要因

2 02 2 年我在北京做一个项目,线程池问题确实很头疼。
我将主线程数(corePoolSize)设置为1 6 当工作负载不高时,那些线程会处于空闲状态,无论如何也不会死掉。
我将最大线程数(maximumPoolSize)设置为3 2 当任务量增加时,主线程太忙,因此会打开新线程,但当达到3 2 时就会停止。
无论添加多少个任务,它们都会排队。
我将空闲线程生存时间(keepAliveTime)设置为1 秒。
非核心线程如果空闲超过1 秒就会死亡,核心线程不会在意。
时间单位(TimeUnit)是秒,很简单。
任务队列(workQueue)我用的是LinkedBlockingQueue,有5 1 2 个任务,够用了。
如果任务来得太快,他就会陷入困境。
线程工厂(threadFactory) 我给线程命名,例如“task-1 ”、“task-2 ”,这样我可以很容易地发现问题。
我经常使用 CallerRunsPolicy 作为我的拒绝(处理程序)策略。
当新任务到达时,我让提交任务的线程自行完成,而不创建新线程。
反正任务量不大的时候,我的CPU是够用的。

线程池七大核心参数

嘿,我们正在谈论线池。
我最近接了一个项目,部长在北京、上海、广州,那个人很忙。
客户总是抱怨响应速度慢。
经检查,发现是油箱螺纹没有调整好。

这里线程核心数取决于你的业务。
例如,当时我有一个电子商务系统,在高峰期每秒必须处理数百个订单。
我建议核心线程数5 0个,反正服务器挺给力的,就算闲着也会闲着。
结果呢?好多了,我开始工作并且能够做到这一点。

然后是最大线程数。
就看你的奴隶能不能忍受了。
我的服务器当时内存足够大,放1 5 0个,如果任务太多,队列满了,可以多开线程,但不能开太多,不然服务器就烧了。

老人会熬过时间,这也是他。
我把时间设置为 6 0 秒。
这意味着,如果线程在 6 0 秒内没有要执行的功能,它应该消失并节省一些资源。
但如果你觉得时间短,可以把这个时间加长一些。

工作队列,您必须选择正确的一个。
我当时用的是LinkedBlockingQueue。
这个队列相当稳定,没有崩溃。
如果你的工作量不大,也可以使用SynchronousQueue,效率很高。

老优先级,这个要看任务的紧急程度。
当时我的体重很大,所以我把先跑步作为首要任务。

拒绝军方,这个必须提前想好。
我当时使用的是CallerRunsPolicy,这意味着调用任务是自己运行的。
如果不想运行处理程序,也可以使用 AbortPolicy 直接抛出异常。

最后还有一个线程工厂。
这可用于自定义序列的属性。
我当时用的不多,但是如果你想设置恶魔线程或者特殊的预设,你可以使用这个。

综上所述,线槽模块调整是一项技术性工作,应根据实际情况而定。
如果你不知道如何适应,可以先看看别人的经验,然后与你的业务结合起来。