【问题标题】:Can a java fixedThreadPool be used by multiple threadsjava fixedThreadPool可以被多个线程使用吗
【发布时间】:2010-09-24 08:22:07
【问题描述】:

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

我对这种方法的疑问:

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

【问题讨论】:

    标签: java web-services concurrency threadpool executorservice


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2019-10-14
          • 2019-06-03
          • 1970-01-01
          • 2011-07-26
          • 2016-07-12
          • 1970-01-01
          • 2016-01-22
          • 2018-01-31
          • 1970-01-01
          相关资源
          最近更新 更多