2010-07-16 29 views
3

我有三個Java的LinkedBlockingQueue實例,我只想使用一個線程從中讀取(take操作)。天真的方法是每個隊列有一個線程。從單個線程內的多個BlockingQueues中讀取

有沒有像UNIX的select系統調用阻塞Java中的隊列?

謝謝。

+0

所以你想要三個隊列互相排斥,那就是一個線程一次可以從三個隊列中的一個隊列中讀取? – 2010-07-16 18:22:07

回答

2

那麼,這些BlockingQueues真的是要由他們自己的線程提供服務。

東西我會考慮嘗試是建立一個第四隊列小得多的項目,說Boolean S,並且對每一個3個其他隊列的offer()呼叫通過插入一個布爾成4隊列陪伴他們的插入。然後,您的線程可以在第四個隊列中進入睡眠狀態,當它醒來時,可以在另外3個隊列中找到peek()以查找從哪裏獲得貨物。

我認爲這是一種非常不雅的解決方案,我懷疑有可能出現種族情況,在這種情況下,有些時候你不會被清醒地喚醒。但它應該基本上工作。

+4

第4個隊列可以是隊列的隊列。當將一個元素添加到* ith *隊列中時,將* ith *隊列添加到第4個隊列中。在第4個隊列中被阻塞的線程take()將得到* ith *隊列,其中*可能*包含一個新元素。 – irreputable 2010-07-16 16:45:32

+0

這是一個非常聰明的主意! +1。 – 2010-07-16 16:55:50

+0

確實很聰明。 +1 – 2010-07-17 17:31:12