代码之家  ›  专栏  ›  技术社区  ›  Gregory Mostizky

Java服务器的单线程池还是多线程池?[关闭]

  •  12
  • Gregory Mostizky  · 技术社区  · 16 年前

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

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

    另一方面,我知道有些人更希望有一个单线程池,在它上面运行所有的东西,而不需要任何分离。

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

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

    这有关系吗?

    2 回复  |  直到 16 年前
        1
  •  6
  •   Adamski    16 年前

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

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

    另一种方法是使用 PriorityQueue ThreadPoolExecutor 并为写入请求分配更高的优先级。

    最后,我的建议是:从一个线程池开始,只有在有具体原因的情况下才能使您的设计更加复杂。

        2
  •  0
  •   KLE rslite    16 年前

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

    您的石英作业可以暂停、取消等,我们称之为“ 管理 ". 我想你会创建一些UI来管理它们。

    你是否意识到你的其他工作(“按需”)将不会从相同的功能中受益,除非你实现它当然? 你考虑过把所有的东西都做成石英的吗 (即使它立即启动),得到一个统一的代码?