有点像“阻塞集”。我如何实现一个阻塞队列,其中添加已经在组中的成员将被忽略?仅包含唯一元素的Java阻塞队列
6
A
回答
0
您可以覆盖任何实施BlockingQueue<T>
的add和put方法,以首先检查元素是否已经在队列中,例如,
@Override
public boolean add(T elem) {
if (contains(elem))
return true;
return super.add(elem);
}
4
您可以创建一个组成BlockingQueue,Set和锁的新类。当你把()你测试对照集合,同时拿着防止get()运行的锁。当你得到()时,你从该集合中删除该项目,以便它可以在将来再次放置()。
-2
class BlockingSet extends ArrayBlockingQueue<E> {
/*Retain all other methods except put*/
public void put(E o) throws InterruptedException {
if (!this.contains(o)){
super.put(o);
}
}
}
+0
'contains'的实现遍历列表,这会很慢... – 2013-04-12 13:23:48
1
通过用于预知迭代顺序和一定的时间增加,删除和链接哈希set支持一种阻塞队列实现包含操作:
1
我写了这个类来解决类似的问题:
/**
* Linked blocking queue with {@link #add(Object)} method, which adds only element, that is not already in the queue.
*/
public class SetBlockingQueue<T> extends LinkedBlockingQueue<T> {
private Set<T> set = Collections.newSetFromMap(new ConcurrentHashMap<>());
/**
* Add only element, that is not already enqueued.
* The method is synchronized, so that the duplicate elements can't get in during race condition.
* @param t object to put in
* @return true, if the queue was changed, false otherwise
*/
@Override
public synchronized boolean add(T t) {
if (set.contains(t)) {
return false;
} else {
set.add(t);
return super.add(t);
}
}
/**
* Takes the element from the queue.
* Note that no synchronization with {@link #add(Object)} is here, as we don't care about the element staying in the set longer needed.
* @return taken element
* @throws InterruptedException
*/
@Override
public T take() throws InterruptedException {
T t = super.take();
set.remove(t);
return t;
}
}
相关问题
- 1. Java中的阻塞队列
- 2. Java,被阻塞的队列
- 3. 当队列类型包含通用类型时阻塞队列
- 4. 非阻塞队列
- 5. 阻塞队列Ç
- 6. 阻塞队列不阻塞线程?
- 7. Java中的并发和阻塞队列
- 8. LinkedTransferQueue是阻塞队列还是非阻塞队列?
- 9. 阻塞队列将等待元素出列多长时间?
- 10. 阻塞队列实现
- 11. 测试非阻塞队列
- 12. 队列阻塞主线程
- 13. 阻塞队列和InterruptedException
- 14. 阻塞队列设计
- 15. REST和阻塞队列
- 16. 单进程阻塞队列
- 17. GCD - dispatch_async上阻塞队列
- 18. Java - 并发/阻塞队列单元测试策略
- 19. 的Java的TimerTask应该等待一个阻塞队列
- 20. 是否在同步GCD队列上放置一个阻止阻塞并暂停其他阻塞的阻塞?
- 21. 有没有办法在java中阻塞套接字和阻塞队列?
- 22. 包含嵌套非阻塞函数的节点阻塞函数?
- 23. 阻塞队列的“联合”的实现
- 24. ThreadPoolExecutor共享相同的阻塞队列
- 25. 阻塞两个队列上的呼叫?
- 26. Win32 API的信号灯 - 阻塞队列
- 27. 摆脱列表中仅包含空格的一些元素
- 28. JQuery阻止UI元素阻塞问题
- 29. 并发包中的阻塞队列方法;
- 30. Java中的阻塞队列的优点是什么?
好的,但不是最优的,因为正常的BlockingQueue实现包含的()要求整个队列 – 2011-03-08 19:56:48
的遍历,我会说:“最佳”是主观的。除非你自己推出,否则其他简单的选项就是秒杀建议的选项,这是一个经典的空间与时间的折衷。所以虽然任何一个都可以被认为是最好的解决方案,但依靠它的用途,我会因为它的简单性而投票赞成。 – 2011-03-08 21:03:27
如果“最优”包含正确的,那么这个实现会失败,因为它是一个竞争条件。 – jtahlborn 2012-11-21 15:57:37