据我所知,链表和数组都可以无限增长,还是我错了?但是,当我通过执行者服务中的文件时,我看到了这一点:
无限的队列。使用无界队列(例如,没有预定义容量的LinkedBlockingQueue )将导致在所有corePoolSize线程繁忙时在队列中等待新任务。因此,将只创建corePoolSize线程。(因此,maximumPoolSize的值没有任何影响。)
那么,当Unbounded Queue具有定义的容量时,LinkedBlockingQueue属性会改变吗?
这是为ArrayBlockingQueue写的
有界队列。当与有限的ArrayBlockingQueue一起使用时,有界队列(例如,一个maximumPoolSizes )有助于防止资源耗尽,但可能更难调优和控制。队列大小和最大池大小可以相互交换:使用大队列和小池可以将CPU使用、OS资源和上下文切换开销降到最低,但会导致人为的低吞吐量。如果任务经常阻塞(例如,如果它们是I/O绑定的),系统可能会安排更多线程的时间。使用小队列通常需要更大的池大小,这使CPU更加繁忙,但可能会遇到不可接受的调度开销,这也会降低吞吐量。
发布于 2012-08-06 14:51:39
为什么你认为一个ArrayBlockingQueue可以无限增长?从它的自己的文件
这是一个典型的“有界缓冲区”,其中一个固定大小的数组保存由生产者插入并由使用者提取的元素。一旦建立,能力就无法提高。将元素放入完整队列的尝试将导致操作阻塞;从空队列获取元素的尝试也将类似地阻止。
换句话说,一旦它吃饱了,它就满了--它不会生长。
您是否有可能与ArrayList混淆--这也是由数组支持的,但它会根据需要进行扩展?
那么,当LinkedBlockingQueue具有定义的容量时,无界队列属性会发生变化吗?
是的,因此它在爪哇中被描述为“可选限定的”。此外,docs指出(强调我的):
可选容量绑定构造函数参数用作防止过度扩展队列的方法。容量(如果未指定)等于Integer.MAX_VALUE。链接节点是在每个插入上动态创建的,除非这会使队列超出容量。
发布于 2012-08-06 14:55:10
用于LinkedBlockingQueue的javadoc说:
一个基于链接节点的可选有界阻塞队列. 可选容量绑定构造函数参数用作防止过度扩展队列的方法。容量(如果未指定)等于Integer.MAX_VALUE。
ArrayBlockingQueue的javadoc说:
由数组支持的有界阻塞队列. 这是一个典型的“有界缓冲区”,其中一个固定大小的数组保存由生产者插入并由使用者提取的元素。一旦创建,容量就无法增加。
因此,LinkedBlockingQueue可以是有界的,也可以是无界的,而ArrayBlockingQueue总是有界的。
发布于 2012-08-06 14:52:50
据我所知,链表和数组都可以无限增长,或者我错了吗?
作为无限大小的链接列表。数组有固定的大小。ArrayList封装一个数组,并在需要更大的数组时替换它。
当LinkedBlockingQueue具有定义的容量时,无界队列属性也会发生变化。
当LinkedBlockingQueue具有最大容量时,它是有界的,但默认情况下它不会以这种方式使用。
https://stackoverflow.com/questions/11830664
复制相似问题