1

我有一个 Web 服务,它在返回结果之前会进行多次小计算。我想使用ExecutorService提供Executors.newFixedThreadPool()的方式来实现 Master - Worker 模式(即调用invokeAll并让线程等待所有结果完成)。理想情况下,所有 web 服务线程都使用相同的执行器服务,这样它们就不必都创建自己的线程池,它们可以共享一个用完系统所有处理时间的大池。

我对这种方法有疑问:

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

3 回答 3

2

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

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

于 2008-11-27T16:22:03.080 回答
1

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

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

于 2008-11-27T14:53:04.163 回答
0

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

于 2008-11-27T14:57:46.963 回答