Java阻塞队列查找,获取和删除

时间:2014-09-08 17:44:18

标签: java concurrency

在阻塞队列中,我们是否有API来实现此要求,如果一个对象(比如一个String)在队列中,则返回它然后将其从队列中删除。

当然,我们可以循环队列并逐个执行if-else,如果不匹配,则将其放回队列。我们有更好的方法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

如果您只需要根据相等(equals方法)进行比较,那么您可以使用BlockingQueue的{​​{3}}方法删除对象。

E.g。

BlockingQueue<String> myQueue = new ArrayBlockingQueue<String>(10);
myQueue.add("hello");
myQueue.add("goodbye");
System.out.println("Queue contains goodbye: " + myQueue.contains("goodbye"));

myQueue.remove("goodbye");
System.out.println("Queue contains goodbye: " + myQueue.contains("goodbye"));

如果需要根据其他一些条件删除对象,则必须使用可用的迭代器迭代队列。根据特定的实现队列,迭代器可能支持也可能不支持remove操作(检查特定类的文档)。 ArrayBlockingQueueLinkedBlockingQueue都有支持remove的迭代器,实际上ArrayBlockingQueue.remove(Object o)的实现只是调用并使用它自己的迭代器和iterator.remove。

E.g。

BlockingQueue<String> myQueue = new ArrayBlockingQueue<String>(10);
myQueue.add("hello");
myQueue.add("goodbye");
System.out.println("Queue contains goodbye: " + myQueue.contains("goodbye"));

Iterator<String> iterator = myQueue.iterator();
while(iterator.hasNext())
{
    if (iterator.next().contains("good")) iterator.remove();
}
System.out.println("Queue contains goodbye: " + myQueue.contains("goodbye"));

如果队列的迭代器支持remove,那么这是一个比删除和重新添加所有其他队列元素(特别是基于链表的队列)更优化的解决方案。

答案 1 :(得分:0)

BlockingQueue接口及其所有实现都有一个名为remove(Object o)的方法,它从该队列中删除指定元素的单个实例。您可以在存储字符串数据的BlockingQueue实现上使用此方法,并且可以删除一个对象。