2015-07-10 280 views
0

我想要一個線程安全的容器,阻止調用方,直到項目變得可用。物品將以每秒1000秒的速度添加到此容器中,但不會以相同的速度排出。因此,我希望容器不允許重複。 我寫了一個關於LinkedBlockingQueue的簡單包裝,但很快就意識到我已經重新創建了經典的生產者 - 消費者的死鎖。這是我寫的:BlockingQueue像容器,不允許重複

public class ActivityListener { 
    private final BlockingQueue<ID> activeItems = new LinkedBlockingQueue<>(); 

    public synchronized ID take() throws InterruptedException { 
     return activeItems.take(); 
    } 

    public synchronized void registerActivity(final ID item) { 
     if (!activeItems.contains(item)) { 
      activeItems.add(item); 
     } 
    } 

    public synchronized boolean isItemActive(final ID item) { 
     return activeItems.contains(item); 
    } 
} 

我找不到一個既定的解決我的問題,並希望得到任何幫助。

+0

你需要一個_full_的BlockingQueue的實現,或只是'把()'和'採取()'? – jtahlborn

+0

我只需要把和 – user1071840

+0

可能的重複:http://stackoverflow.com/questions/3120495/concurrent-set-queue – wickstopher

回答

0

覆蓋任何BlockingQueue實現的add()和put()方法,首先檢查元素是否已經在隊列中。

喜歡的東西 -

@Override 
public boolean add(T obj) { 
    if (contains(obj)) 
     return true; 
    return super.add(obj); 
} 
+0

這不是線程安全的,不幸的是可能不能這樣做(至少在一般情況下案件)。 – jtahlborn

+0

另外,當一個對象沒有添加到集合中時,從類集接口上的add方法返回true是非慣用的。 – wickstopher