2012-08-13 159 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