首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ArrayBlockingQueue被称为有界队列,而LinkedBlockingQueue被称为无界阻塞队列?

为什么ArrayBlockingQueue被称为有界队列,而LinkedBlockingQueue被称为无界阻塞队列?
EN

Stack Overflow用户
提问于 2012-08-06 14:49:51
回答 5查看 16.6K关注 0票数 9

据我所知,链表和数组都可以无限增长,还是我错了?但是,当我通过执行者服务中的文件时,我看到了这一点:

无限的队列。使用无界队列(例如,没有预定义容量的LinkedBlockingQueue )将导致在所有corePoolSize线程繁忙时在队列中等待新任务。因此,将只创建corePoolSize线程。(因此,maximumPoolSize的值没有任何影响。)

那么,当Unbounded Queue具有定义的容量时,LinkedBlockingQueue属性会改变吗?

这是为ArrayBlockingQueue写的

有界队列。当与有限的ArrayBlockingQueue一起使用时,有界队列(例如,一个maximumPoolSizes )有助于防止资源耗尽,但可能更难调优和控制。队列大小和最大池大小可以相互交换:使用大队列和小池可以将CPU使用、OS资源和上下文切换开销降到最低,但会导致人为的低吞吐量。如果任务经常阻塞(例如,如果它们是I/O绑定的),系统可能会安排更多线程的时间。使用小队列通常需要更大的池大小,这使CPU更加繁忙,但可能会遇到不可接受的调度开销,这也会降低吞吐量。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-06 14:51:39

为什么你认为一个ArrayBlockingQueue可以无限增长?从它的自己的文件

这是一个典型的“有界缓冲区”,其中一个固定大小的数组保存由生产者插入并由使用者提取的元素。一旦建立,能力就无法提高。将元素放入完整队列的尝试将导致操作阻塞;从空队列获取元素的尝试也将类似地阻止。

换句话说,一旦它吃饱了,它就满了--它不会生长。

您是否有可能与ArrayList混淆--这也是由数组支持的,但它会根据需要进行扩展?

那么,当LinkedBlockingQueue具有定义的容量时,无界队列属性会发生变化吗?

是的,因此它在爪哇中被描述为“可选限定的”。此外,docs指出(强调我的):

可选容量绑定构造函数参数用作防止过度扩展队列的方法。容量(如果未指定)等于Integer.MAX_VALUE。链接节点是在每个插入上动态创建的,除非这会使队列超出容量

票数 14
EN

Stack Overflow用户

发布于 2012-08-06 14:55:10

用于LinkedBlockingQueue的javadoc说:

一个基于链接节点的可选有界阻塞队列. 可选容量绑定构造函数参数用作防止过度扩展队列的方法。容量(如果未指定)等于Integer.MAX_VALUE。

ArrayBlockingQueue的javadoc说:

由数组支持的有界阻塞队列. 这是一个典型的“有界缓冲区”,其中一个固定大小的数组保存由生产者插入并由使用者提取的元素。一旦创建,容量就无法增加。

因此,LinkedBlockingQueue可以是有界的,也可以是无界的,而ArrayBlockingQueue总是有界的。

票数 4
EN

Stack Overflow用户

发布于 2012-08-06 14:52:50

据我所知,链表和数组都可以无限增长,或者我错了吗?

作为无限大小的链接列表。数组有固定的大小。ArrayList封装一个数组,并在需要更大的数组时替换它。

当LinkedBlockingQueue具有定义的容量时,无界队列属性也会发生变化。

当LinkedBlockingQueue具有最大容量时,它是有界的,但默认情况下它不会以这种方式使用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11830664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档