我在ThreadPoolExecutor中使用LinkedBlockingQueue作为工作队列。问题是我应该使用有界LinkedBlockingQueue或无界LinkedBlockingQueue。我已经覆盖了ThreadPoolExecutor的execute方法,并且在核心池大小之后不再面临线程创建的问题。
所以请告诉我使用LinkedBlockingQueue有界或无界的哪个更好。
谢谢, 图沙尔
答案 0 :(得分:4)
无限制队列是确保没有任务被拒绝的安全方法,或者使用具有如此大容量的有界队列,以便能够保存应用程序中可能存在的最大数量的任务。这取决于您的应用程序的设计。我想如果您理解(与架构师讨论)应用程序设计,您将能够决定队列的大小。关于内存和CPU,除非你向队列添加任务,否则它们不会增加,并且对于两者都是相同的 - 无界或有界。 (在演示应用程序中测试)
public static void main(String[] args)
{
LinkedBlockingQueue<Runnable> r = new LinkedBlockingQueue<Runnable>(11);
while(true)
{
// r.offer(new Task(1));
}
}
只是玩弄大小来检查。
答案 1 :(得分:3)
无界LinkedBlockingQueue
基本上是一个容量为java.lang.Integer.MAX_VALUE
的有界队列。所以是的,正如评论中所提到的,根据您的需要使用有界或无界的队列,而不是性能,因为无论您是否指定限制,都会发生大小检查。
与往常一样,如果您事先知道容量,我建议对具有给定容量的有界容量进行无限制队列使用情况分析,但我不建议使用该路由,除非您有证据证明队列是导致性能的队列您的申请中的问题。
答案 2 :(得分:1)
如果您可以估计队列中有多少待处理项目,最好使用有界队列。在队列中插入项目的线程可以在估计的队列大小之后知道队列是否已满。
这完全取决于您要执行的任务。如果要创建在队列中插入项目的线程在队列中的最大待处理项目数之后等待,则应考虑有界队列。
有限队列在内存和CPU方面会更好,因为只有最多有限数量的项可以在队列中(内存优势),并且如果队列已满,将使队列中的项插入等待的线程(CPU的好处) )。总体表现将得到改善。
当队列中的排队率不等于出队率时,这将有很大的优势。