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

Java基础 潘老师 2年前 (2022-03-11) 921 ℃ (0) 扫码查看

在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包提供的,根据自己的实际的需求进行选择与配置,而独自为不同业务场景定义自己的线程池也保证了它更大的灵活性。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/4647.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】