Java 一个给定应用程序有多个SingleThreadExecutor…好主意?

Java 一个给定应用程序有多个SingleThreadExecutor…好主意?,java,multithreading,pool,Java,Multithreading,Pool,这个问题是关于使用SingleThreadExecutor(JDK 1.6)的后果。相关的问题以前在这个论坛上已经被问到和回答过,但我相信我所面临的情况,是有点不同的 应用程序的各个组件(让我们调用组件C1、C2、C3等)生成(出站)消息,主要是响应它们从其他组件接收到的消息(入站)。这些出站消息保存在队列中,这些队列通常是ArrayBlockingQueue实例,这可能是相当标准的做法。但是,出站消息必须按照添加顺序进行处理。我想使用SingleThreadExector是显而易见的答案。我们

这个问题是关于使用
SingleThreadExecutor
(JDK 1.6)的后果。相关的问题以前在这个论坛上已经被问到和回答过,但我相信我所面临的情况,是有点不同的

应用程序的各个组件(让我们调用组件C1、C2、C3等)生成(出站)消息,主要是响应它们从其他组件接收到的消息(入站)。这些出站消息保存在队列中,这些队列通常是
ArrayBlockingQueue
实例,这可能是相当标准的做法。但是,出站消息必须按照添加顺序进行处理。我想使用
SingleThreadExector
是显而易见的答案。我们最终的情况是1:1,一个队列(专用于一个组件发出的消息)有一个
SingleThreadExecutor

现在,在给定时刻,组件(C1、C2、C3…)的数量未知。它们将根据用户的需要而存在(最终也将被处置)。我们讨论的是峰值负载下的200-300个此类组件。按照上述1:1的设计原则,我们将安排200个
SingleThreadExecutor
s。这就是我在这里查询的来源

一想到必须创建这么多SingleThreadExecutor,我就感到不舒服。我宁愿尝试使用SingleThreadExecutor的池,如果这是合理的(任何现成的,在类/模式之前看到的?)。我在这里读了很多关于建议使用
SingleThreadExecutor
的帖子,但是有一个相同的池呢


这里有学问的女人和男人是怎么想的?我希望得到指示、纠正或简单的警告:-)。

如果您的要求是按照消息发布的顺序处理消息,那么您只需要一个
SingleThreadExecutor
。如果您有多个执行器,则消息将在整个执行器集中无序处理

如果消息只需要按照单个生产者接收消息的顺序进行处理,那么每个生产者有一个执行者是有意义的。如果您尝试汇集执行者,那么您将不得不投入大量工作来确保生产者和执行者之间的亲和力


既然您指出您的生产者将定义生命周期,那么您必须确保的一件事是在执行者完成后正确关闭它们。

如果您的要求是按照消息发布的顺序处理消息,那么您只需要一个
SingleThreadExecutor
。如果您有多个执行器,则消息将在整个执行器集中无序处理

如果消息只需要按照单个生产者接收消息的顺序进行处理,那么每个生产者有一个执行者是有意义的。如果您尝试汇集执行者,那么您将不得不投入大量工作来确保生产者和执行者之间的亲和力


由于您指出生产者将定义生命周期,因此您必须确保的一件事是,在执行者完成时,您正确地关闭了执行者。

消息传递和批处理作业已经被一次又一次地解决了。我建议不要再试图解决它。相反,请查看Quartz,它维护线程池、在数据库中持久化任务等。或者,最好查看JMS/ActiveMQ。但是,如果你还没有研究过石英,至少要研究一下石英。哦,Spring使使用Quartz变得更加容易…

消息传递和批处理作业已经被一次又一次地解决了。我建议不要再试图解决它。相反,请查看Quartz,它维护线程池、在数据库中持久化任务等。或者,最好查看JMS/ActiveMQ。但是,如果你还没有研究过石英,至少要研究一下石英。哦,而且Spring使使用石英变得更加容易…

我看不出有任何问题。本质上,您有独立的队列,每个队列都必须按顺序排空,每个队列一个线程是一种自然设计。你能想到的其他东西基本上都是一样的。例如,当JavaNIO第一次出现时,编写框架是为了利用它并摆脱每请求线程模型。最后,一些作者承认,为了提供一个好的编程模型,他们只是重新实现线程

我看不出有什么问题。本质上,您有独立的队列,每个队列都必须按顺序排空,每个队列一个线程是一种自然设计。你能想到的其他东西基本上都是一样的。例如,当JavaNIO第一次出现时,编写框架是为了利用它并摆脱每请求线程模型。最后,一些作者承认,为了提供一个好的编程模型,他们只是重新实现线程

如果不了解更多有关应用程序的信息,就无法确定300个甚至3000个线程是否会导致任何问题。我强烈建议您在添加更复杂的应用程序之前对应用程序进行概要分析

您应该检查的第一件事是并发运行的线程的数量不应该比可用于运行这些线程的内核的数量高得多。您拥有的活动线程越多,管理这些线程所浪费的时间就越多(上下文切换代价高昂),完成的工作也就越少

限制运行线程数量的最简单方法是使用信号量。开始工作前获取信号量,工作完成后释放信号量

不幸的是,限制运行线程的数量可能不够。虽然这可能会有所帮助,但若每个上下文切换花费的时间是一个工作单元总成本的主要部分,那个么开销可能仍然很大。在这种情况下,oft