2012-08-13 240 views
0

我需要一些包含字符串值的Java集合,並且已經同步添加元素的方法(如果它不存在)(類似addIfAbsent是ArrayList)。收集將在交通繁忙。此外,我想有一些超時機制,之後集合中的條目到期。超時應該在5秒左右。Java併發設置超時

優雅的解決方案的任何建議?沒有超時機制的選擇集合也會有幫助。

感謝您的幫助。

回答

2

解釋超時爲時間值,之後插入集合的項目將被刪除,也許Guava Cache implementation適合您的需求?它不直接公開putIfAbsent方法,但可以使用CacheLoader或提供Callable以根據需要生成值。

String value = cache.get("key", new Callable<String>() { ... }); 

如果cache不包含給定key值的調用將被調用。

+0

番石榴緩存看起來喜歡的事,會做的伎倆我。我在我的問題中沒有提到的一件事是,當調用'cache.get(...)'時,我需要知道密鑰是否已經存在於緩存中。準確地說,我需要原子性的put-if-absent,以返回緩存中密鑰的先前存在的信息。我能找到的唯一解決方案是使用緩存作爲地圖: 'value = cache.asMap()。putIfAbsent(key,value)' 這樣我就失去了Guava的自加載操作,但我是使用它們的超時機制。你對此有何看法? – njosa 2012-08-15 16:15:37

+0

@njosa:如果你真的需要這些信息「我插入了它,但它之前沒有」,那麼我想你將沒有其他選擇。如果您只想確保該值確實在稍後請求的映射中,則'cache.get(String,Callable)'方法更好。 「Callable」將被調用,並在請求和不存在時生成值。所以對呼叫者來說它是透明的。如果你只需要一個項目是否存在的信息'getIfPresent()'可能會有所幫助。 – Stephan 2012-08-15 19:00:16

3

您是否正在實施某種形式的緩存機制?如果是這樣,就不需要重新發明輪子。你可以使用一些緩存實現,比如EhCache。

請看一看這個線程:similar question about collections with timeout (caches)

+0

謝謝你的幫助,那個線程確實幫助我理解我真正需要的東西。 – njosa 2012-08-15 16:17:59