作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个流程,多个生产者填充队列,单个消费者处理从该队列检索的数据。
为了提高效率,消费者使用 BlockingQueue#drainTo
API 从队列中排出数据。但有一个问题,当队列为空时,消费者会尝试在循环中耗尽数据,而不会延迟,从而消耗大量 CPU。
是否有 API 允许使用类似于 BlockingQueue#poll(long timeout, TimeUnit unit)
的超时耗尽队列?
示例消费者代码:
while (threadIsActive) {
List<Event> events = new ArrayList<>();
queue.drainTo(events);
processEvents(events);
}
最佳答案
我最终使用了 @Kayaman 建议的 poll/drainTo 组合,我不太喜欢它,它看起来很丑。但我会接受任何其他提出更好解决方案的答案:
while (threadIsActive) {
Event firstEvent = queue.poll(queuePollTimeout, TimeUnit.MILLISECONDS);
if (firstEvent != null) {
// reserve enough space to fit first event, current queue capacity and
// new events which occur while we are draining
int drainCapacity = queue.size() * 2;
List<Event> events = new ArrayList<>(drainCapacity);
events.add(firstEvent);
queue.drainTo(events);
processEvents(events);
}
}
关于java - 超时排空队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40473126/
假设我想要一个类似 chargen 的服务器,所以我调用 while sleep 1; do date; done | ncat -kl 12345 如果没有人在读取管道,那么第一个连接到套接字的客户
我是一名优秀的程序员,十分优秀!