哪个更好: 无界的LinkedBlockingQueue还是带容量的LinkedBlockingQueue?

7

我正在使用LinkedBlockingQueue作为ThreadPoolExecutor中的工作队列。问题是我应该使用有界的LinkedBlockingQueue还是无界的LinkedBlockingQueue。我已经重写了ThreadPoolExecutor的execute方法,不再面临核心线程池大小后创建线程的问题。

所以,请告诉我使用有界LinkedBlockingQueue还是无界LinkedBlockingQueue更好。

谢谢, Tushar


发布相关代码可能有助于我们回答您的问题。 - David says Reinstate Monica
1
如果您需要一个有界的,请使用有界的,如果不需要,请使用无界的!“更好”是什么意思?它们都是一件事,一件是有界的,另一件是无界的!请澄清您的问题 :) - Mahdi Shabani
更好的意味着在CPU使用率、内存使用率和吞吐量方面,即整体效率方面有所提升。 有界和无界链式阻塞队列上的轮询和提供操作是否具有不同的性能统计数据? - Scientist
没有明显的理由认为哪一个在这些方面更好。关键在于你需要哪种行为。 - user207421
3个回答

4

无边界队列是一种安全的方式,可以确保没有任务被拒绝。或者使用有界队列,其容量足够大,能够容纳应用程序可能出现的最大任务数。这取决于应用程序的设计。我认为,如果你理解(与架构师讨论)应用程序的设计,则能够决定队列的大小。至于内存和CPU,除非向队列添加任务,否则它们不会增加,并且对于无限制队列和有限制队列来说都是相同的。(在演示应用程序中进行了测试)

public static void main(String[] args)
{
   LinkedBlockingQueue<Runnable> r = new LinkedBlockingQueue<Runnable>(11);

  while(true)
  {
     //    r.offer(new Task(1));
  }
}

只需随意更改大小以进行检查。


4
一个无边界的LinkedBlockingQueue本质上是一个容量为java.lang.Integer.MAX_VALUE的有界队列。所以,是的,正如评论中所提到的,根据您的需求使用有界或无界队列,并不是为了性能,因为无论您是否指定限制,大小检查都会发生。
一如既往地,如果您事先知道容量,我建议对具有给定容量的有界队列使用分析无边界队列的用法,尽管除非您有证据表明队列是导致应用程序性能问题的原因,我不建议走这条路。

2
如果您能估算队列中最大挂起项数,最好使用有界队列。插入项的线程可以在估计队列大小后知道队列是否已满。
所有这一切都取决于您想要执行的任务。如果您想让插入项的线程在队列中最大挂起项数后等待,应考虑有界队列。
有界队列在内存和CPU方面表现更好,因为队列中最多只能有有界数量的项目(内存优势),并且会使将项目插入队列的线程在队列已满时等待(CPU优势)。总体性能将得到改善。
这将具有很大的优势,当排队速率不等于出队速率时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接