多个线程可以使用java fixedThreadPool吗?

时间:2008-11-27 14:45:01

标签: java web-services concurrency threadpool executorservice

我有一个Web服务,在返回结果之前会执行多个小计算。我想使用ExecutorService提供的Executors.newFixedThreadPool()作为实现Master - Worker模式的方法(即调用invokeAll并让线程等待所有结果完成)。理想情况下,所有Web服务线程都使用相同的执行程序服务,因此它们不必全部创建自己的线程池,并且它们只能共享一个占用系统所有处理时间的大型池。

我对这种方法的疑问:

  • 从多个线程访问invokeAll函数是安全的。
  • 执行程序服务将按顺序处理请求(即,首先是线程1的所有任务,然后是线程的那些任务
  • 有没有办法说10个工作线程并且可用的线程数最多取决于进入的请求数,所以说我们有1个请求,它使用所有10个线程来处理该请求。如果你有2个请求,它会为每个请求分割5个线程等。

3 个答案:

答案 0 :(得分:2)

在Java EE服务器中运行时,不应自行创建线程。我意识到这不是很好的情况,因此您应该根据您使用的应用服务器调查替代方案。如果是WebSphere或Weblogic,则应使用commonj规范的WorkManager,它提供您想要的确切功能。 JBoss也有一个实现。

您应该考虑在托管环境中创建自己的线程作为最后的手段。

答案 1 :(得分:1)

我想说不要使用invokeAll。让每个请求为要并行执行的每个子任务调用ExecutorService.submit。线程池将处理任务的调度(这就是它的设计目的!)。

是的,如果你使用Executors.newFixedThreadPool(),每个请求都会被放入队列中,所以它们会被顺序处理。

答案 2 :(得分:0)

我认为你应该使用Semaphore而不是invokeAll()