有點像「阻塞集」。我如何實現一個阻塞隊列,其中添加已經在組中的成員將被忽略?僅包含唯一元素的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