Java服务器的单个或多个线程池?

时间:2009-09-17 08:07:10

标签: java multithreading threadpool

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

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

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

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

分离线程池有什么优点?

甚至重要吗?

2 个答案:

答案 0 :(得分:6)

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

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

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

总而言之 - 我的建议是:从一个线程池开始,只有在具体原因下才能让你的设计更复杂。

答案 1 :(得分:0)

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

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

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