是否有使用阻塞队列的实现,但限制了最大大小。当队列的大小达到给定的max-size时,它将移除head元素并插入它,而不是阻塞'put‘。所以put不是被阻塞的(),而是take()。
一种用法是,如果我有一个非常慢的消费者,系统不会崩溃(内存耗尽),而是这些消息将被删除,但我不想阻止生产者。
这方面的一个例子是股票交易系统。当您的股票交易/报价数据达到峰值时,如果您还没有使用数据,您希望自动丢弃旧的股票交易/报价。
发布于 2010-05-07 21:10:06
在Java中,目前还没有一个线程安全的队列可以做你想要的事情。但是,有一个BlockingDequeue (Double and,双端队列),您可以编写一个包装器,在其中您可以自由地从头部和尾部获取。
这个类类似于BlockingQueue,是线程安全的。
发布于 2010-05-07 12:36:55
ThreadPoolExecutor中提供了几种策略。在此javadoc中搜索"AbortPolicy“。如果需要,您还可以实现自己的策略。也许Discard和你想要的很相似。就我个人而言,我认为CallerRuns在大多数情况下都是你想要的。
我认为使用它们是一个更好的解决方案,但如果你绝对想在队列中实现它,我可能会通过组合来实现。也许可以使用LinkedList或其他东西,并用synchronize关键字包装它。
编辑:(一些澄清..)"Executor“基本上是一个与阻塞队列相结合的线程池。这是在java中实现生产者/消费者模式的推荐方式。这些库的作者提供了几种策略来处理您提到的问题。如果你感兴趣,here是另一种专门解决OOME问题的方法(源代码是特定于框架的,不能原样使用)。
https://stackoverflow.com/questions/2786132
复制相似问题