Java多场景需求使用各自独立线程池还是共用一个线程池?

在Java项目开发过程中,我们经常会使用到线程池,但是当面对多个任务场景,我们是给每个场景单独定义一个线程池,还是所有场景共用一个线程池?想必,很多同学也为此纠结过,那我们应该具体怎么做呢?

一、建议

这里我们建议,如果你的Java项目中有多个场景需要使用线程池,那么最好为每一个业务场景使用独立的线程池,不要让所有的场景共用一个线程池

二、原因分析

1)独立的线城池之间互相不影响彼此的任务作业,更有利于保证本任务的独立性和完整性,更符合低耦合的设计思想

2)如果所有的场景共用一个线程池,可能会出现如下问题,举例:

比如有任务A、任务B、任务C 这三个任务场景共用一个线程池,配置如下:

threadPool:
  corePoolSize: 10
  maximumPoolSize : 1000
  workQueue : 1000
  keepAliveSeconds: 300

提示:关于这些线程池参数的含义,如果你不了解,请参考Java创建线程池的几种方式具体实现,这里面有关ThreadPoolExecutor线程池类7大参数含义的详解。

假想一种情况,当任务C请求量剧烈增加的时候就会占用线程池中所有的线程,导致任务A和任务B没有线程可用,从而出现迟迟获取不到资源的情况。比如任务C同时有2000个线程请求,此时就可能会导致 任务A和任务B分配不到资源或者分配到很少的线程资源。如果,任务C每个任务运行时间再非常长,那任务A和B基本就会长时间处于等待状态

所以为了避免这种情况的产生,最好的方式是建立独立的线程池

这样不管任务C的线程是堵塞还是其他原因,都不会影响任务A和任务B的执行,同理任务A、任务B也一样不会影响其他场景任务的执行,从而保证竞争只在该业务场景内部,而不会影响外部场景

3)每个任务场景的线程最好都有自己的线程名称,这样便于出现问题进程日志排查,因此,不同的场景最好还是使用自己独立的线程池,也便于区分线程名称与业务场景的对应关系

三、总结

Java多场景任务需求还是建议使用各自独立线程池,这些线程池可能来自JDK内部定义的,也可能是第三方jar包提供的,根据自己的实际的需求进行选择与配置,而独自为不同业务场景定义自己的线程池也保证了它更大的灵活性

肯定是多个线程池:

  1. JDK自带的类使用了很多的线程池
  2. 很多开源框架使用了大量的线程池
  3. 自己的应用也会创建多个线程池
  4. 不要在意什么CPU密集还是IO密集(这是一种人云亦云的说法,至少java语言来说不要考虑什么IO还是CPU)
  5. 多少个线程池,每个线程池提供多少线程,必须经过详细的测试,不能人云亦云,不能参考别人.不同的业务,不同的场景,线程池的个数,线程的数量都是不一样的

一台服务器硬件资源是固定的,比如20核心40线程的CPU,能部署一个应用,就尽量部署一个,不要什么都部署(除tomcat外其他应用)

经过测试你会发现:

  1. 有时候线程创建多了会消耗大量的内存,关键是无法提升性能
  2. 当你创建1个线程,5线程,10线程时,处理数据的性能差不多,那就不应该创建多个
  3. 所以,线程池相关的问题,需要经过长时间的测试,不断的测试最终提供一套符合目前需求的参数
  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值