有序多线程消息处理

时间:2012-04-28 19:28:52

标签: java concurrency messaging

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

请考虑以下示例:我有一个发布者将数字发送到队列中:1, 2, 3, 4, 5, 6, 7

我的目标是顺序处理赔率和平均值。

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

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

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

2 个答案:

答案 0 :(得分:1)

不是答案,但评论时间太长。

  

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

在这种情况下,你不能有多个线程用于赔率,一个用于平均值。您需要顺序运行的任何原因?您是否使用process(2)的结果来运行process(4)

  

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

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

答案 1 :(得分:0)

如果您有两种类型,并且每种类型都需要按类型顺序处理,则只能有2个线程。如果没有其他类型的消息要处理,则只有1个线程可以正常工作。

在这种情况下,使用2个队列并根据其中的类型放置消息&让每个线程消耗一个队列。您可以使用第三个线程来分发消息,但是如果一个线程有一个完整的队列,您必须等到您可以使用来自原始生成器的消息,除非您有办法单独请求每个类型或者您可以丢弃消息。你受限于你自己的限制。

除了理论部分,你可能想看看BlockingQueues& ExecuterServices就像那个答案:Producer/Consumer threads using a Queue