Gee*_*eek 8 java java.util.concurrent
据我所知,链表和数组都可以无限制地增长,或者我错了吗?但是当我查看Executor Service中的文档时,我看到了:
无限的队列.使用无界队列(例如,没有预定义容量的LinkedBlockingQueue)将导致新任务在所有corePoolSize线程忙时在队列中等待.因此,只会创建corePoolSize线程.(而且maximumPoolSize的值因此没有任何影响.)
Unbounded Queue当LinkedBlockingQueue具有已定义的容量时,属性是否会发生变化?
这写给ArrayBlockingQueue:
有界的队列.有限队列(例如,ArrayBlockingQueue)在与有限maximumPoolSizes一起使用时有助于防止资源耗尽,但可能更难以调整和控制.队列大小和最大池大小可以相互交换:使用大型队列和小型池最小化CPU使用率,OS资源和上下文切换开销,但可能导致人为的低吞吐量.如果任务经常阻塞(例如,如果它们是I/O绑定的),系统可能能够为您提供比您允许的更多线程的时间.使用小队列通常需要更大的池大小,这会使CPU更加繁忙,但可能会遇到不可接受的调度开销,这也会降低吞吐量.
And*_*yle 13
为什么你认为一个ArrayBlockingQueue可以无限制地成长?从它自己的文件:
这是一个经典的"有界缓冲区",其中固定大小的数组包含由生产者插入并由消费者提取的元素.一旦创建,容量就无法增加.尝试将元素放入完整队列将导致操作阻塞; 尝试从空队列中获取元素同样会阻塞.
换句话说,一旦它变满,它就会充满 - 它不会增长.
你有ArrayList没有机会混淆- 这也是一个阵列的支持,但是根据需要扩展了这个?
当LinkedBlockingQueue具有已定义的容量时,Unbounded Queue属性是否会更改?
是的,因此它在Javadocs中被描述为"可选 - 有界" .此外,文档说明(强调我的):
可选的容量绑定构造函数参数用作防止过多队列扩展的方法.如果未指定,则容量等于Integer.MAX_VALUE.每次插入时都会动态创建链接节点,除非这会使队列超出容量.