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