首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArrayBlockingQueue如何避免对数组元素进行洗牌?

ArrayBlockingQueue如何避免对数组元素进行洗牌?
EN

Stack Overflow用户
提问于 2016-11-10 11:51:08
回答 2查看 181关注 0票数 6

场景:在我的消费者有机会消费之前,我的生产者填充数组,比如容量新int10。我的制作人看到数组已满并阻塞。

然后,我的使用者出现并移除int,并向生产者发出信号,表示数组现在有一个空槽要填充。

我的生产者醒了,并尝试向数组中添加一个新元素。考虑到只有int是免费的,而且我们正在实现FIFO,那么ArrayBlockingQueue是否将剩下的9个元素都移到左边,填充0-8个索引,并将int9留给生产者呢?

我看过实现,但没有看到任何数组复制功能,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-10 11:56:32

不执行数组元素的复制,因为ArrayBlockingQueue使用数组作为循环缓冲区。它维护两个索引,takeIndexputIndex,并在它们到达数组末尾时包装它们。

在添加或接受元素的操作之后,它调用一个名为inc的私有“增量”方法,该方法将索引封装在末尾:

代码语言:javascript
复制
final int inc(int i) {
    return (++i == items.length)? 0 : i;
}

下面是如何使用此方法的示例:

代码语言:javascript
复制
private void insert(E x) {
    items[putIndex] = x;
    putIndex = inc(putIndex); // <<== Wraps around
    ++count;
    notEmpty.signal();
}
票数 5
EN

Stack Overflow用户

发布于 2016-11-10 12:03:16

ArrayBlockingQueue维护两个变量,假设、frontIndex、rearIndex来处理这个问题,而不是移动元素。如果队列已满。消费者从索引a中提取任何元素,然后rearIndex移动到索引1,下次每当生产者尝试添加任何元素frontIndex时,将在E 1159<代码>E 216索引之后移动到E 214索引。下一个put操作将在a上完成。

这里,FrontIndex==RearIndex表示队列已满。

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

https://stackoverflow.com/questions/40526943

复制
相关文章

相似问题

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