2014-03-19 56 views
1

背景:我需要以異步的方式將許多小尺寸的消息發送給WebSocket客戶端。消息通常是在高峯期發送的,因此在暫停後我需要快速發送〜5000條消息。所以,問題是:如何創建我們可以阻塞的Java併發隊列 - 在單個調用中使用多個元素?

  • 我不想在單個線程啓動5000米異步的
  • 我不想循環「開始異步」 - 「等待完成」 5000串行
  • 倍我不希望使用5000周的主題,使用單一的「開始異步」 - 「等待完整的」每線程

最好的辦法是組〜每個線程20個異步操作,所以我需要非常具體的隊列

  • 很多意味着隊列併發推/輪詢
  • 小型異步意味着我想在束輪詢,如每個隊列take()1〜20的消息(所以我可以開始1 .. .20異步I/O並等待單線程完成)
  • 立即意味着我不想等待20個消息輪詢,只有在隊列中有很多消息時才使用輪詢輪詢。單個消息應該被輪詢並立即發送。

所以基本上:我需要結構像隊列已經阻斷取(1至X)等待在單個阻塞調用元件。僞代碼:

[each of ~50 processing threads]: 
messages = queue.blockingTake(max 10 or at least 1 if less than 10 available); 
for each message: message.startAsync() 
for each message: message.waitToComplete() 
repeat 

回答

0

如果不是真的需要,我不會從頭開始實施隊列。一些想法,如果你有興趣:

隊列>如果你只有1個線程做報價。如果你有更多,該集合必須同步。就像一個提交者peek()進入隊列一樣,看到最後一個集合有太多元素,所以它創建一個新元素並提供它。

若干運行的線程,其中可運行取元件通過一個從隊列中的一個。每發送線程,如果保持隊列的引用,然後可以將循環方式元素添加到他們每個人的

1隊列。

子您選擇的BlockingQueue的,並創建一個「集合取(int i)以」法與正常起飛的重寫版本()。

相關問題