我正在使用LinkedBlockingQueue作为ThreadPoolExecutor中的工作队列。问题是我应该使用有界的LinkedBlockingQueue还是无界的LinkedBlockingQueue。我已经重写了ThreadPoolExecutor的execute方法,不再面临核心线程池大小后创建线程的问题。
所以,请告诉我使用有界LinkedBlockingQueue还是无界LinkedBlockingQueue更好。
谢谢, Tushar
我正在使用LinkedBlockingQueue作为ThreadPoolExecutor中的工作队列。问题是我应该使用有界的LinkedBlockingQueue还是无界的LinkedBlockingQueue。我已经重写了ThreadPoolExecutor的execute方法,不再面临核心线程池大小后创建线程的问题。
所以,请告诉我使用有界LinkedBlockingQueue还是无界LinkedBlockingQueue更好。
谢谢, Tushar
无边界队列是一种安全的方式,可以确保没有任务被拒绝。或者使用有界队列,其容量足够大,能够容纳应用程序可能出现的最大任务数。这取决于应用程序的设计。我认为,如果你理解(与架构师讨论)应用程序的设计,则能够决定队列的大小。至于内存和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
的有界队列。所以,是的,正如评论中所提到的,根据您的需求使用有界或无界队列,并不是为了性能,因为无论您是否指定限制,大小检查都会发生。