2009-05-06 25 views
16

我正在使用一个队列来保存有关需要发送到远程主机的消息的信息。在这种情况下,一个线程负责将信息放入队列中,另一个线程负责从队列中获取信息并发送它。第二个线程需要定期检查队列中的信息。Java中的阻塞队列的优点是什么?

但后来我发现这是车轮:)我可以用一个阻塞队列用于此目的的再造。

对上述应用程序使用阻塞队列有什么其他优点? (例:性能,可修改的代码,任何特殊的技巧等)

回答

26

主要优点是BlockingQueue提供了一个正确的,线程安全的实现。开发人员已经实施了这个功能多年,但要正确使用它却非常棘手。现在,运行时已经由并发专家开发,审查和维护了一个实现。

队列的“阻塞”性质有几个优点。首先,在添加元素时,如果队列容量有限,则内存消耗也是有限的。另外,如果队列消费者远远落后于生产者,则生产者自然会受到限制,因为他们必须等待添加元素。从队列中获取元素时,主要优点是简单;永远等待是微不足道的,正确地等待指定的超时只是稍微复杂一点。

6

你消除阻塞队列他们关键的是“轮询”。这就是你说的地方

在这种情况下,第二个线程需要定期检查队列中的信息。

这可能是非常低效的 - 使用许多不必要的CPU时间。它也可能引入不必要的延迟。

12

一种阻塞队列是当你试图从中出列块队列,队列为空,或者如果您尝试排队的项目它和队列已满。试图从空队列中出队的线程被阻塞,直到其他线程将一个项插入到队列中。尝试将队列排入队列中的线程会被阻塞,直到某个其他线程在队列中产生空间为止,或者通过将一个或多个项目出队或完全清除队列。