2012-04-28 146 views
1

什麼是有序多線程消息處理的常用方法?

請考慮以下示例:我有一個將數字發送到隊列的發佈者:1, 2, 3, 4, 5, 6, 7

我的目標是按順序處理賠率和均衡。

我知道的一種可能的解決方案是根據n % m條件爲每個線程分開一個單獨的隊列並拆分原始隊列。

我擔心的是數字可能分佈不均勻,我最終會得到一些線索,以減少工作量。

我一直在考慮實現自定義隊列,它將檢查具有相同條件的隊列元素是否正在被其他線程處理,如果有,請嘗試找到另一個線程。這可能會起作用,我試圖實現一些東西,但它變得複雜並且很難測試。這就是爲什麼我首先嚐試找到現有解決方案的原因。有序多線程消息處理

+0

你一定需要多線程?如果您能夠首先使用evens排序列表,並且賠率持續下去,它會起作用嗎?正如assylias所說,如果你能讓我們知道你希望線程如何工作。這將有助於 – 2012-04-28 19:41:20

+0

是的,我需要多線程,因爲此解決方案的實際應用將不得不處理大量的數據,而不是數字。我只是爲了便於描述問題而編號。 – 2012-04-28 20:42:48

回答

1

不是一個答案,但太長的評論。

我的目標是按順序處理賠率和均衡。

在這種情況下,你不能有多於一個線程的賠率和一個evens。任何你需要連續運行的原因?你使用process(2)的結果來運行process(4)

我擔心的是,數字可能分佈不均勻,我最終會得到一些線索,以減少工作要做。

可能,但是如何在不破壞順序約束的情況下將更多工作分配給空閒線程?

+0

我只是將數字作爲示例來演示問題。實際上我不知道我有多少個團體或類型。我使用來自JMS隊列的消息。獨立的消息可以同時處理,但我有其他類型的消息(取消,修改),應該只按照它們的到達順序進行處理。 – 2012-04-28 20:38:11

0

如果您有2種類型,每種類型都必須按照類型進行處理,您可以只有2個線程。如果沒有其他類型的消息只處理1個線程可以工作。

在這種情況下,使用2個隊列並根據類型放置消息&讓每個線程使用一個隊列。您可以使用第三個線程來分發消息,但如果一個線程擁有完整的隊列,則必須等待,直到您可以使用原始生產者的消息,除非您有辦法單獨請求每種類型,或者可以丟棄消息。你在這裏受到你自己的限制。

除了你可能想看看BlockingQueues & ExecuterServices像這個問題的答案理論部分:Producer/Consumer threads using a Queue

+0

我知道生產者/消費者模式,但現有的Queue和ExecutorService實現僅適用於獨立數據的多線程處理。 – 2012-04-28 20:40:24

+0

因此,您需要一種動態線程+隊列池,可以將線程重新分配給不同類型的消息? – zapl 2012-04-28 21:05:43

+0

我在考慮自定義隊列的實現,它可以檢查當前正在處理哪些元素類型,哪些不是。沒有被處理的組可以通過空閒線程出列。 – 2012-04-28 21:33:43