2010-07-16 62 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