我在ThreadPoolExecutor中使用ThreadPoolExecutor作为工作队列。问题是我应该使用有界LinkedBlockingQueue还是无界LinkedBlockingQueue。我已经重写了ThreadPoolExecutor的执行方法,不再面临在内核池大小之后创建线程的问题。
所以请告诉我用LinkedBlockingQueue有界还是无界比较好。
谢谢你,图沙尔
发布于 2013-10-15 08:21:06
无界队列是确保没有任务被拒绝的安全方法,或者使用容量大到能够容纳应用程序中最大数量的任务的有界队列。这取决于应用程序的设计。我认为,如果您理解(与架构师讨论)应用程序设计,您将能够决定队列的大小。至于内存和CPU,除非将任务添加到队列中,否则它们不会增加,而且两者都是一样的--无界或有界。(在演示应用程序中进行测试)
public static void main(String[] args)
{
LinkedBlockingQueue<Runnable> r = new LinkedBlockingQueue<Runnable>(11);
while(true)
{
// r.offer(new Task(1));
}
}随便看看大小就行了。
发布于 2013-10-15 06:49:03
无界LinkedBlockingQueue基本上是一个容量为java.lang.Integer.MAX_VALUE的有界队列。因此,是的,正如注释中提到的,根据您的需要使用有界队列或无界队列,而不是为了性能而使用,因为无论您是否指定限制,都会进行大小检查。
与往常一样,如果事先知道容量,我建议将无限制队列使用情况与具有给定容量的有界队列进行分析,不过,除非您有证据证明队列是导致应用程序中性能问题的队列,否则我不会建议使用该路由。
发布于 2013-10-15 06:32:11
如果您可以估计队列中挂起的项的最大数量,最好是使用有界队列。在队列中插入项的线程可以在估计队列大小后知道队列是否已满。
这都取决于您想要执行的任务。如果要使插入队列中项的线程在队列中的挂起项的最大数量之后等待,则应考虑有界队列。
有界队列在内存和CPU方面会更好,因为最多只能有有限数量的项可以在队列中(内存利益),并且会使在队列中插入项的线程在队列满时等待(CPU利益)。总体业绩将得到改善。
:当队列中的排队率不等于脱队列率时,这将具有很大的优势。
https://stackoverflow.com/questions/19374460
复制相似问题