Java 顺序多线程消息处理

Java 顺序多线程消息处理,java,concurrency,messaging,Java,Concurrency,Messaging,有序多线程消息处理的常用方法是什么? 考虑下面的例子:我有一个出版商将数字发送到队列: 1, 2, 3、4, 5, 6、7 < /代码> BR> BR> 我的目标是按顺序处理胜负。 我知道的一种可能的解决方案是,每个线程有一个单独的队列,并根据n%m标准分割原始队列。 我担心的是,数字可能分布不均,最终会有一些线程的工作量减少。 我一直在考虑实现自定义队列,该队列将检查其他线程是否正在处理具有相同条件的队列元素,如果正在处理,则尝试查找另一个。这可能行得通,我已经尝试实现了一些东西,但它变得复杂

有序多线程消息处理的常用方法是什么?

考虑下面的例子:我有一个出版商将数字发送到队列:<代码> 1, 2, 3、4, 5, 6、7 < /代码> BR> BR> 我的目标是按顺序处理胜负。

我知道的一种可能的解决方案是,每个线程有一个单独的队列,并根据
n%m
标准分割原始队列。

我担心的是,数字可能分布不均,最终会有一些线程的工作量减少。


我一直在考虑实现自定义队列,该队列将检查其他线程是否正在处理具有相同条件的队列元素,如果正在处理,则尝试查找另一个。这可能行得通,我已经尝试实现了一些东西,但它变得复杂,更难测试。这就是为什么我首先尝试找到问题的现有解决方案。

不是答案,但评论太长了

我的目标是按顺序处理赔率和偶数

在这种情况下,你不能有超过一个线程的赔率和一个为evens。你为什么需要连续跑步?您是否使用
过程(2)
的结果来运行
过程(4)

我担心的是,数字可能分布不均,最终会有一些线程需要做的工作更少


可能吧,但是如何在不打破顺序约束的情况下将更多的工作分配给空闲线程呢?

不是答案,但是注释太长了

我的目标是按顺序处理赔率和偶数

在这种情况下,你不能有超过一个线程的赔率和一个为evens。你为什么需要连续跑步?您是否使用
过程(2)
的结果来运行
过程(4)

我担心的是,数字可能分布不均,最终会有一些线程需要做的工作更少


可能,但是如何在不破坏顺序约束的情况下将更多的工作分配给空闲线程呢?

如果有两种类型,并且每种类型都必须按顺序处理,那么只能有两个线程。如果没有其他类型的消息要处理,则只有一个线程可以工作

在这种情况下,使用2个队列并将基于类型的消息放入其中&让每个线程使用一个队列。您可以使用第三个线程来分发消息,但如果一个线程的队列已满,您必须等待,直到您可以使用来自原始生产者的消息,除非您有办法单独请求每种类型的消息,或者您可以丢弃消息。在这里,您受到自己的限制


除了理论部分之外,您可能还想看看BlockingQueues&ExecuterServices,如答案所示:

如果您有2种类型,并且每种类型都必须按顺序处理,那么您只能有2个线程。如果没有其他类型的消息要处理,则只有一个线程可以工作

在这种情况下,使用2个队列并将基于类型的消息放入其中&让每个线程使用一个队列。您可以使用第三个线程来分发消息,但如果一个线程的队列已满,您必须等待,直到您可以使用来自原始生产者的消息,除非您有办法单独请求每种类型的消息,或者您可以丢弃消息。在这里,您受到自己的限制


除了理论部分之外,您可能还想看看BlockingQueues&ExecuterServices,如回答中所示:

您一定需要多线程吗?如果你能先以偶数排序,最后以赔率排序,这行得通吗?正如assylias所说,如果您能让我们知道您希望线程如何工作。这将有帮助是的,我需要多线程,因为这个解决方案的实际应用将必须处理大量数据,而不是数字。我用数字只是为了更容易描述问题你需要多线程吗?如果你能先以偶数排序,最后以赔率排序,这行得通吗?正如assylias所说,如果您能让我们知道您希望线程如何工作。这将有帮助是的,我需要多线程,因为这个解决方案的实际应用将必须处理大量数据,而不是数字。我拿数字只是为了更容易描述问题我拿数字作为例子来说明问题。事实上,我不知道我有多少组或类型。我使用来自JMS队列的消息。独立消息可以同时处理,但我有其他类型的消息(取消、修改),它们只应按到达的顺序进行处理。我仅以数字为例来说明这个问题。事实上,我不知道我有多少组或类型。我使用来自JMS队列的消息。独立消息可以同时处理,但我有其他类型的消息(取消、修改),它们只应按到达顺序处理。我知道生产者/消费者模式,但是Queue和ExecutorService的现有实现仅适用于独立数据的多线程处理。因此,您需要一种动态线程+队列池,它可以将线程重新调整用途以处理不同类型的消息?我正在考虑定制队列实现,它可以检查当前正在处理的元素类型而那些不是。未被处理的组可以由空闲线程退出队列。是的,听起来您需要在这里实现一些自定义的功能。例如,您可以使用一个同步集,其中线程在处理消息之前检查某个消息类型是否可用,然后将其放回,这样您就可以动态地将线程“分配”给消息类型,并且仍然确保顺序处理。我知道生产者/消费者模式,但现有的queue和ExecutorService实现只适用于独立数据的多线程处理