我有一个Java应用程序,处理不同的地区,例如10个地区。每个地区有不同数量的任务。
我遇到的一个问题是某个地区(Region A
)的任务比较多,每个任务在该区域的处理时间比较长,所以如果我使用一个Single Thread Pool
,所有区域的任务都提交给Single Thread Pool
。Region A
的任务会阻塞其他区域的任务,其他区域的任务只能在阻塞队列中等待Region A
的任务完成。
我想实现的是,如果有5000个Region A
的任务提交给Single Thread Pool
,并且每个任务都在长时间的处理,那么其他区域的任务可以并行处理,而不会被Region A
的任务阻塞。
我有一个要求,不能为Single Thread Pool
创建太多的线程,也不建议使用newCachedThreadPool()
。
我的方法是为每个区域创建1个线程池,这样总共会创建10个线程池,但我不知道多线程池是否有问题,是否有其他合适的方法来实现。
1条答案
按热度按时间bd1hkmkf1#
正在运行的线程的处理能力总是受到硬件CPU提供的线程数量的限制-在将线程分配到线程池时请记住这一点。
每个区域使用
newFixedThreadPool(int nThreads)
。如果您的处理主要是计算密集型的,选择较小的大小;也许区域A为
newFixedThreadPool(3)
,其它区域为newFixedThreadPool(1)
。如果您的处理花费大量时间等待线程外部的处理(例如Web或数据库调用),请选择较大的数字。
试验一下,看看什么能提供可接受的活泼性。