什麼是有序多線程消息處理的常用方法?
請考慮以下示例:我有一個將數字發送到隊列的發佈者:1, 2, 3, 4, 5, 6, 7
我的目標是按順序處理賠率和均衡。
我知道的一種可能的解決方案是根據n % m
條件爲每個線程分開一個單獨的隊列並拆分原始隊列。
我擔心的是數字可能分佈不均勻,我最終會得到一些線索,以減少工作量。
我一直在考慮實現自定義隊列,它將檢查具有相同條件的隊列元素是否正在被其他線程處理,如果有,請嘗試找到另一個線程。這可能會起作用,我試圖實現一些東西,但它變得複雜並且很難測試。這就是爲什麼我首先嚐試找到現有解決方案的原因。有序多線程消息處理
回答
不是一個答案,但太長的評論。
我的目標是按順序處理賠率和均衡。
在這種情況下,你不能有多於一個線程的賠率和一個evens。任何你需要連續運行的原因?你使用process(2)
的結果來運行process(4)
?
我擔心的是,數字可能分佈不均勻,我最終會得到一些線索,以減少工作要做。
可能,但是如何在不破壞順序約束的情況下將更多工作分配給空閒線程?
我只是將數字作爲示例來演示問題。實際上我不知道我有多少個團體或類型。我使用來自JMS隊列的消息。獨立的消息可以同時處理,但我有其他類型的消息(取消,修改),應該只按照它們的到達順序進行處理。 – 2012-04-28 20:38:11
如果您有2種類型,每種類型都必須按照類型進行處理,您可以只有2個線程。如果沒有其他類型的消息只處理1個線程可以工作。
在這種情況下,使用2個隊列並根據類型放置消息&讓每個線程使用一個隊列。您可以使用第三個線程來分發消息,但如果一個線程擁有完整的隊列,則必須等待,直到您可以使用原始生產者的消息,除非您有辦法單獨請求每種類型,或者可以丟棄消息。你在這裏受到你自己的限制。
除了你可能想看看BlockingQueues & ExecuterServices像這個問題的答案理論部分:Producer/Consumer threads using a Queue
我知道生產者/消費者模式,但現有的Queue和ExecutorService實現僅適用於獨立數據的多線程處理。 – 2012-04-28 20:40:24
因此,您需要一種動態線程+隊列池,可以將線程重新分配給不同類型的消息? – zapl 2012-04-28 21:05:43
我在考慮自定義隊列的實現,它可以檢查當前正在處理哪些元素類型,哪些不是。沒有被處理的組可以通過空閒線程出列。 – 2012-04-28 21:33:43
- 1. Anynchronous多線程消息處理
- 2. Clojure消息處理/異步,多線程
- 3. 在tomcat中使用多線程處理websocket消息消息
- 4. 消息處理程序
- 5. SOAP消息處理程序
- 6. UIScrollView消息處理程序
- 7. 發送消息給處於死線程的處理程序
- 8. 線程休眠處理JMS消息時
- 9. Android UI線程和消息處理程序混淆
- 10. Android線程處理程序未收到消息
- 11. 將消息發送到死線程上的處理程序
- 12. 處理程序未能向主線程傳遞消息或Runnable
- 13. 獲取主線程的消息隊列和處理程序
- 14. 消息處理程序和命令處理程序之間有區別嗎?
- 15. JMS隊列上多線程消息處理的最佳實踐
- 16. 使用多個MessageListener線程處理重複的JMS消息
- 17. 線程池多客戶端TCP(消息處理)
- 18. 處理多條消息
- 19. ASP.NET Web API消息處理程序
- 20. 安裝消息處理程序
- 21. 問題與消息處理程序
- 22. Websocketpp設置消息處理程序
- 23. 重複處理程序消息?
- 24. ASP.NET Web API消息處理程序
- 25. Masstransit。處理程序不確認消息
- 26. ActiveMQ/JMS消息處理程序測試
- 27. Android:比較處理程序的消息
- 28. Spring集成消息處理程序:ActiveMQTextMessage
- 29. 的Android,處理程序消息
- 30. 從消息處理程序啓動asynctask
你一定需要多線程?如果您能夠首先使用evens排序列表,並且賠率持續下去,它會起作用嗎?正如assylias所說,如果你能讓我們知道你希望線程如何工作。這將有助於 – 2012-04-28 19:41:20
是的,我需要多線程,因爲此解決方案的實際應用將不得不處理大量的數據,而不是數字。我只是爲了便於描述問題而編號。 – 2012-04-28 20:42:48