首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在排出ArrayBlockingQueue之前阻塞

在排出ArrayBlockingQueue之前阻塞
EN

Stack Overflow用户
提问于 2013-03-04 08:32:20
回答 1查看 275关注 0票数 0

我发现自己在重复这种模式,并且经常想知道它在Java中是惯用的,还是有更好的方法来实现这种行为。

问题:给定生产者/消费者设置,消费者想要处理成批的项目,所以它使用drainTo(),但是drainTo()将轮询现有项目并可能无法获得任何项目,为了避免这种情况,我在排水口前添加了take(),以确保它阻塞,直到至少有一个项目可用。

对于特定的数据集,我遇到的一个问题是,在许多用例中,批量大小通常是不规则的,在(1,N,1,N)之间交替。通常情况下,这是解决此问题的常用方法:

示例:

代码语言:javascript
复制
 ArrayBlockingQueue<Foo> queue;

 function void produce() {
    while(true) {
       queue.put(createFoo());
    }
 }

 function void consumeBatchSpin() {
    while(true) {
       List<Foo> batch = Lists.newLinkedList();
       queue.drainTo(batch);

       doSomething(batch);
       //the problem here is that if nothing is being produced, this loop will spin
    }
 }

 function void consumeBatchTake() {
    while(true) {
       List<Foo> batch = Lists.newLinkedList();
       batch.add(queue.take()); //force at least one item to be there
       queue.drainTo(batch);

       doSomething(batch);
    }
 }
EN

回答 1

Stack Overflow用户

发布于 2013-03-04 08:48:50

您是否考虑过添加到列表中并在get上获取whole list。

我最近发布了一个here。它正在接受代码审查here,但我的测试表明它是健壮的。

本质上,当您执行put时,您会将新元素添加到当前列表中。当您执行get时,您将获得整个列表,并自动将其替换为一个新的空列表。

不需要使用drainTo,也不需要旋转。

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

https://stackoverflow.com/questions/15192736

复制
相关文章

相似问题

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