章
目
录
在Java项目开发过程中,我们经常会使用到线程池,但是当面对多个任务场景,我们是给每个场景单独定义一个线程池,还是所有场景共用一个线程池?想必,很多同学也为此纠结过,那我们应该具体怎么做呢?
一、建议
这里我们建议,如果你的Java项目中有多个场景需要使用线程池,那么最好为每一个业务场景使用独立的线程池,不要让所有的场景共用一个线程池。
二、原因分析
1)独立的线城池之间互相不影响彼此的任务作业,更有利于保证本任务的独立性和完整性,更符合低耦合的设计思想
2)如果所有的场景共用一个线程池,可能会出现如下问题,举例:
比如有任务A、任务B、任务C 这三个任务场景共用一个线程池,配置如下:
threadPool: corePoolSize: 10 maximumPoolSize : 1000 workQueue : 1000 keepAliveSeconds: 300
假想一种情况,当任务C请求量剧烈增加的时候就会占用线程池中所有的线程,导致任务A和任务B没有线程可用,从而出现迟迟获取不到资源的情况。比如任务C同时有2000个线程请求,此时就可能会导致 任务A和任务B分配不到资源或者分配到很少的线程资源。如果,任务C每个任务运行时间再非常长,那任务A和B基本就会长时间处于等待状态。
所以为了避免这种情况的产生,最好的方式是建立独立的线程池。
这样不管任务C的线程是堵塞还是其他原因,都不会影响任务A和任务B的执行,同理任务A、任务B也一样不会影响其他场景任务的执行,从而保证竞争只在该业务场景内部,而不会影响外部场景。
3)每个任务场景的线程最好都有自己的线程名称,这样便于出现问题进程日志排查,因此,不同的场景最好还是使用自己独立的线程池,也便于区分线程名称与业务场景的对应关系。
三、总结
Java多场景任务需求还是建议使用各自独立线程池,这些线程池可能来自JDK内部定义的,也可能是第三方jar包提供的,根据自己的实际的需求进行选择与配置,而独自为不同业务场景定义自己的线程池也保证了它更大的灵活性。