Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LinkedBlockingQueue unbounded和LinkedBlockingQueue with capacity哪个更好_Java_Multithreading_Queue_Threadpoolexecutor - Fatal编程技术网

Java LinkedBlockingQueue unbounded和LinkedBlockingQueue with capacity哪个更好

Java LinkedBlockingQueue unbounded和LinkedBlockingQueue with capacity哪个更好,java,multithreading,queue,threadpoolexecutor,Java,Multithreading,Queue,Threadpoolexecutor,我正在使用LinkedBlockingQueue作为ThreadPoolExecutor中的工作队列。问题是我应该使用有界LinkedBlockingQueue还是无界LinkedBlockingQueue。我已经重写了ThreadPoolExecutor的execute方法,不再面临在核心池大小之后创建线程的问题 所以,请告诉我使用LinkedBlockingQueue bounded或unbounded哪个更好 谢谢, Tushar如果您可以估计队列中最多可以有多少挂起的项目,最好使用有界队

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

所以,请告诉我使用LinkedBlockingQueue bounded或unbounded哪个更好

谢谢,
Tushar

如果您可以估计队列中最多可以有多少挂起的项目,最好使用有界队列。在队列中插入项目的线程可以知道在估计队列大小之后队列是否已满

这完全取决于您想要执行的任务。如果要在队列中插入项目等待线程在队列中的最大挂起项目之后等待,则应该考虑有界队列。

有界队列在内存和CPU方面会更好,因为队列中最多只能有有限数量的项(内存优势),并且在队列已满时,将使在队列中插入项的线程等待(CPU优势)。整体表现将得到改善


当队列中的排队率不等于出列率时,这将具有很大的优势。

无界
LinkedBlockingQueue
基本上是一个有界队列,容量为
java.lang.Integer.MAX\u VALUE
。因此,是的,如注释中所述,根据您的需要使用有界或无界队列,而不是为了性能,因为无论您是否指定限制,都会进行大小检查


一如既往,如果你事先知道容量,我建议根据具有给定容量的有界队列分析无界队列的使用情况,但我不建议使用该路线,除非您有证据证明该队列是导致应用程序性能问题的队列。

无界队列是确保不拒绝任何任务的安全方法,或者使用容量非常大的有界队列,它能够容纳应用程序中可能出现的最大数量的任务。这取决于应用程序的设计。我认为,若您了解(与架构师讨论)应用程序设计,您将能够决定队列的大小。关于内存和CPU,除非您将任务添加到队列中,否则它们不会增加,并且对于这两种情况都是一样的—无界或有界。(在演示应用程序中测试)

publicstaticvoidmain(字符串[]args)
{
LinkedBlockingQueue r=新的LinkedBlockingQueue(11);
while(true)
{
//r.offer(新任务(1));
}
}

只需调整大小即可。

发布相关代码可能有助于我们回答您的问题如果您需要有界,请使用有界,如果不需要,请使用无界!你的意思是什么?两者都是一回事,一件事是有界的,另一件事是无界的!请澄清您的问题:)在CPU使用率、内存使用率和吞吐量(即总体效率)方面有更好的方法。轮询和提供操作在有界和无界链接阻塞队列上是否具有不同的性能统计信息?没有明显的理由认为两者在这些方面都会更好。这取决于你需要什么样的行为。
public static void main(String[] args)
{
   LinkedBlockingQueue<Runnable> r = new LinkedBlockingQueue<Runnable>(11);

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