【问题标题】:Single or multiple thread pools for Java server? [closed]Java服务器的单线程池还是多线程池? [关闭]
【发布时间】:2010-11-29 01:44:52
【问题描述】:

我正在编写一个相当复杂的 Java 服务器应用程序,除了通常的请求-响应处理之外,它还有一个重要的后台处理部分。一些后台处理是使用 Quartz 框架以类似 cron 的方式完成的。其他任务更多的是按需执行 - 如果新客户端连接它会创建额外的工作以不时更新它。 cron 任务也可以多种多样——一些监视外部应用程序,一些计算统计数据等等。

我正在使用多个线程池来运行所有这些作业,其想法是相似的作业将共享一个线程池,但不同的作业不会共享一个。例如,监控作业永远不会在统计池上运行,统计作业永远不会在监控池上运行。

另一方面,我知道有些人更喜欢只拥有一个线程池并在其上运行所有内容而无需任何分离。

我想知道在这种情况下什么被认为是最佳实践。

分离线程池的优缺点是什么?

这有关系吗?

【问题讨论】:

    标签: java multithreading threadpool


    【解决方案1】:

    答案取决于您是否需要在不同类型的活动之间分离应用程序资源。

    例如,我目前正在编写一个服务器应用程序,该应用程序由几个高吞吐量编写器和可能的许多读取器组成。读者会偶尔访问应用程序,但可能会请求大量数据(即长时间运行的请求)。我需要确保作者永远不会挨饿,所以我将在我的设计中使用两个线程池进行读/写。如果读取器线程池暂时耗尽,写入器将不受影响;只有读取请求会被延迟。

    另一种方法是将PriorityQueueThreadPoolExecutor 结合使用,并为写入请求分配更高的优先级。

    因此,总而言之 - 我的建议是:从一个线程池开始,只有在有具体原因的情况下才使您的设计更加复杂。

    【讨论】:

      【解决方案2】:

      这不是一个直接的答案,而是另一个建议:-(

      您的 Quartz 作业可以暂停、取消等等,我们称之为“托管”。我猜你会创建一些 UI 来管理它们。

      您是否意识到您的其他工作(“按需”)不会从相同的功能中受益,除非您当然实施它? 您是否考虑过让一切都成为石英工作(即使它立即开始),以获得统一的代码?

      【讨论】:

      • 其实这是其中一种选择。但是有两个问题 - 一个是 AFAIK Quartz 强制一个使用单个线程池 - 而我个人的偏好是使用多个。其次,Quartz API 非常适合 cron 类型的作业,但是当您只需要快速并行运行一些算法时会很麻烦。
      • @Gregory 我理解您对线程池编号的担忧。在这一点上我没有建议 :-( 关于笨重的 Quartz,这正是我使用它时的感受!! :-) 我确实将它封装成一个自制的简单方法。
      • 坦率地说,我们在集群上使用 Quartz 也有问题。作业从任何地方开始,而不是在处理请求的服务器上。我认为 Quartz 是在第一个启动的节点上启动的,而其他节点不会启动它。这会导致几个问题...
      猜你喜欢
      • 1970-01-01
      • 2013-11-15
      • 2011-07-14
      • 1970-01-01
      • 2015-09-30
      • 2011-04-28
      • 2013-12-24
      • 2018-09-03
      • 2023-03-02
      相关资源
      最近更新 更多