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

2022-09-04 22:57:05

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

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

另一方面,我知道有些人更喜欢只有一个线程池,并在没有任何分离的情况下运行它上面的所有内容。

我想知道在这种情况下,什么是最佳做法。

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

这重要吗?


答案 1

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

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

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

总而言之,我的建议是:从一个线程池开始,如果有具体的原因,只会让你的设计更加复杂。


答案 2

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

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

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