2008-11-27 56 views
1

我有一个webservice,在返回结果之前进行多个小计算。我想使用Executors.newFixedThreadPool()提供的ExecutorService作为实现主 - 工作模式(即调用invokeAll并让线程等待所有结果完成)的一种方式。理想情况下,所有Web服务线程都使用相同的执行程序服务,以便它们不必都创建自己的线程池,并且可以共享一个占用系统所有处理时间的大型池。一个java fixedThreadPool可以被多个线程使用

问题我有这种做法:

  • 是安全地从多个线程访问invokeAll功能。
  • 将执行服务只是处理请求顺序(即首先从线程1的任务,那么这些线程
  • 是有办法有说10个工作线程,并具有最大的可用线程取决于在正在添加请求的数量,所以说我们有1个请求,它使用所有10个线程,该请求。如果你有2个请求,它分裂他们每个请求的5个线程等

回答

1

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

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

0

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

2

当在Java EE服务器运行时,你不应该自己创建的线程。我意识到这不是一个好的情况,所以你应该根据你使用的应用服务器来调查替代方案。如果是WebSphere或Weblogic,则应使用commonj规范的WorkManager,它提供了所需的确切功能。还有一个JBoss的实现。

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

相关问题