LinkedBlockingQueue put vs offer

Posted

技术标签:

【中文标题】LinkedBlockingQueue put vs offer【英文标题】: 【发布时间】:2013-10-25 12:50:13 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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;

【讨论】:

以上是关于LinkedBlockingQueue put vs offer的主要内容,如果未能解决你的问题,请参考以下文章

LinkedBlockingQueue的put add跟offer的区别

LinkedBlockingQueue put vs offer

并发容器之ArrayBlockingQueue与LinkedBlockingQueue详解

LinkedBlockingQueue的属性简介

SynchronousQueue和LinkedBlockingQueue区别

java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue