15

我有一个链接的阻塞队列,我在其中执行插入和删除操作。

我需要知道哪个更好put,或者offer在链接阻塞队列的情况下。

性能参数是 CPU 利用率、内存和总吞吐量。

应用程序使用的是实时系统,其中可以有多个传入请求和更少的线程来处理我们需要在队列中插入元素的位置。

我阅读了 put 和 offer 的 Java 文档,内部应用程序没有太大区别。

4

3 回答 3

13

其实这两者的性能是没法比较的,offer方法是只提供给队列,不等待或者等待指定的时间,但是put方法无限长地等待直到空间可用,所以它们的用法是不同的。

在您无法承受丢失项目的情况下使用put,请记住它会占用您的调用堆栈,否则使用offer.

于 2013-10-17T06:52:51.977 回答
2

LinkedBlockingQueue 是完全可重入的,并且 poll() 方法不会阻塞 put()。但是, poll() 方法会旋转。您可能应该使用 queue.take() 等待队列中有一个项目,而不是在队列为空时返回 null 。

还要考虑这种情况,poll(long, TimeUnit) 方法将等待一个项目被添加到队列中一段时间​​,如果计时器到期则返回 null。这是一个更干净的等待队列中的东西。

    // wait for 2000ms for there to be an object in the queue
   Object o = queue.poll(2000, TimeUnit.MILLISECONDS);
   // no sleep necessary
   return o;
于 2013-10-17T06:42:15.527 回答
1

文档清楚地说明了这个问题的答案。报价不会等待,如果队列已满,将“放弃”。但是,put 将等待空间变得可用——换句话说,它会阻塞直到空间可用。因此,报价显然更快,因为它从不阻塞。

于 2013-10-17T06:43:27.630 回答