我应该如何设置线程池的参数? 我认为这对很多人来说这也是一个难题,让我们一起解决应该如何设置线程池的参数。
首先设定参数时,需要考虑以下几点!
1、抗下游系统并发能力强
多线程给下游系统带来的并发操作与设置的线程数相同
示例:
如果要通过多线程访问数据库,则必须考虑设置数据库的连接池大小。 存在数据库并发对qps的影响太大,数据库锁定等问题。
如果是接入下游系统的接口,就要考虑下游系统能否承受这么大的并发量,不能切断下游系统。
2、CPU使用率
如果线程数设置得较大,则会出现以下问题:
)线程初始化、切换、销毁等操作占用相对较多的cpu资源,使cpu利用率保持在相对较高的水平。
)线程数较多时,任务在短时间内迅速执行,任务的集中执行会给cpu带来很大压力。
)对任务的集中支持使cpu利用率呈锯齿状。 也就是说,cpu在短时间内上升,然后迅速下降到空闲状态。
处理器的使用不合理。 必须减少线程数量,使任务排队等待,以确保cpu利用率保持在合理且平均的数字范围内。
因此,在cpu充足的情况下,不能太大。 请注意。 并不是越大越好。
此时,上线后,可以观察机器的cpu使用率和cpu负载,通过观察这两个参数判断线程数是否合理。
可以通过命令确定cpu利用率是否主要用于切换线程。
cpu负载是正在运行的线程和等待运行的线程之和。
请注意。 此处的等待是指线程处于运行状态。 但是,尚未安排在cpu上的等待,繁重的负载意味着cpu竞争激烈。 此外,线程设置较大,表示正在占用cpu资源。
通常,合理的值应该与cpu内核数大致相同。
3、线程池中执行的任务的性质
由于计算密集型任务占用cpu,因此线程数通常设置为与cpu的核心数相同或稍大。
但是,IO型任务的主要时间花在IO等待上,cpu压力不是很大,所以线程数一般设定得比较大。
示例:
通过多线程访问数据库时,数据库中有128个表。 这样,我们将直接考虑使用128个线程。
4、内存使用率
线程数量过多,队列大小会影响此数据。
队列大小必须通过预先计算线程池任务的数量来适当调整队列大小。 不要太小而溢出是不合适的。 因为溢出在走拒绝战略,稍微影响其性能的同时,也增加了复杂性。 因此,这里需要仔细考虑拒绝战略的选择。
拒绝策略包括引导策略、呼叫运行策略和
分散策略也不适合太大。 太大了就不能用了。 另外,会消耗比较大的内存。
我想一定要考虑以上四点。 之后,我会介绍很多人容易犯的错误。
如下所示。
线程池配置
在这里,由于发现任务执行慢,机器的cpu、存储器等也低,所以决定了增大线程。
因为需要约100个线程,所以更改配置。
问题:
关于线程池是否创建新线程,请考虑以下几点:
1、如果线程数小于corePoolSize,则直接添加新线程。
2、如果线程数在corePoolSize以上,则排队等待。 如果排队成功,就不添加新线程。
3、如果对列已满,线程数小于maxPoolSize,则创建新线程。 如果大于maxPoolSize,则到达拒绝策略。
因此,由于队列设置很大,通常不会填满,所以线程数实际上一直达不到maxPoolSize。 所以,其实一致地使用了50个线程。
解决:
将核心线程和最大线程设置为一个值,全部设置为100即可。
以上简要介绍了线程池参数的设置,你知道吗? 更多内容,请继续关注奇q工具网常见问答栏。
请阅读: