首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用阻塞的“take()”但使用逐出策略的队列实现

使用阻塞的“take()”但使用逐出策略的队列实现
EN

Stack Overflow用户
提问于 2010-05-07 12:07:13
回答 2查看 784关注 0票数 3

是否有使用阻塞队列的实现,但限制了最大大小。当队列的大小达到给定的max-size时,它将移除head元素并插入它,而不是阻塞'put‘。所以put不是被阻塞的(),而是take()。

一种用法是,如果我有一个非常慢的消费者,系统不会崩溃(内存耗尽),而是这些消息将被删除,但我不想阻止生产者。

这方面的一个例子是股票交易系统。当您的股票交易/报价数据达到峰值时,如果您还没有使用数据,您希望自动丢弃旧的股票交易/报价。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-07 21:10:06

在Java中,目前还没有一个线程安全的队列可以做你想要的事情。但是,有一个BlockingDequeue (Double and,双端队列),您可以编写一个包装器,在其中您可以自由地从头部和尾部获取。

这个类类似于BlockingQueue,是线程安全的。

票数 1
EN

Stack Overflow用户

发布于 2010-05-07 12:36:55

ThreadPoolExecutor中提供了几种策略。在此javadoc中搜索"AbortPolicy“。如果需要,您还可以实现自己的策略。也许Discard和你想要的很相似。就我个人而言,我认为CallerRuns在大多数情况下都是你想要的。

我认为使用它们是一个更好的解决方案,但如果你绝对想在队列中实现它,我可能会通过组合来实现。也许可以使用LinkedList或其他东西,并用synchronize关键字包装它。

编辑:(一些澄清..)"Executor“基本上是一个与阻塞队列相结合的线程池。这是在java中实现生产者/消费者模式的推荐方式。这些库的作者提供了几种策略来处理您提到的问题。如果你感兴趣,here是另一种专门解决OOME问题的方法(源代码是特定于框架的,不能原样使用)。

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

https://stackoverflow.com/questions/2786132

复制
相关文章

相似问题

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