我有一个Java应用程序处理不同的地区,例如10个地区。每个区域有不同数量的任务。
我遇到的一个问题是,一个特定的区域(Region A
)有很多任务,每个任务对该区域的处理时间很长。因此,如果我使用一个Single Thread Pool
,所有区域的任务都会提交给Single Thread Pool
,Region A
的任务会阻塞其他区域的任务。其他区域的任务只能在块队列中等待,直到Region A
的任务完成。
我想实现的是,如果Region A
有5000个任务提交给Single Thread Pool
,并且每个任务都在长时间处理,其他区域任务可以并行处理,而不会被Region A
的任务阻塞。
我有一个要求,不能为Single Thread Pool
创建太多的线程,也不建议使用newCachedThreadPool()
。
我的方法是为每个区域创建1个线程池,总共将创建10个线程池。但我不知道是否有任何问题关于多个线程池,如果有任何其他适当的方式来实现它。
正在运行的线程的处理能力总是受到硬件CPU提供的线程数量的限制-在将线程分配到线程池时请记住这一点。
每个区域使用newFixedThreadPool(int nThreads)
。
如果你的处理主要是计算密集型的,选择较小的大小;A区可能是newFixedThreadPool(3)
,其他区域可能是newFixedThreadPool(1)
。
选择更大的数字,如果你的处理花费很多时间等待线程外部的处理(例如web或db调用)。
实验看看什么能提供可接受的活力。