我有一个Web服务,在返回结果之前会执行多个小计算。我想使用ExecutorService
提供的Executors.newFixedThreadPool()
作为实现Master - Worker模式的方法(即调用invokeAll
并让线程等待所有结果完成)。理想情况下,所有Web服务线程都使用相同的执行程序服务,因此它们不必全部创建自己的线程池,并且它们只能共享一个占用系统所有处理时间的大型池。
我对这种方法的疑问:
invokeAll
函数是安全的。答案 0 :(得分:2)
在Java EE服务器中运行时,不应自行创建线程。我意识到这不是很好的情况,因此您应该根据您使用的应用服务器调查替代方案。如果是WebSphere或Weblogic,则应使用commonj规范的WorkManager,它提供您想要的确切功能。 JBoss也有一个实现。
您应该考虑在托管环境中创建自己的线程作为最后的手段。
答案 1 :(得分:1)
我想说不要使用invokeAll。让每个请求为要并行执行的每个子任务调用ExecutorService.submit。线程池将处理任务的调度(这就是它的设计目的!)。
是的,如果你使用Executors.newFixedThreadPool(),每个请求都会被放入队列中,所以它们会被顺序处理。
答案 2 :(得分:0)
我认为你应该使用Semaphore而不是invokeAll()