Java 具有自动过期元素的映射

Java 具有自动过期元素的映射,java,collections,Java,Collections,我需要一个映射(或任何集合),它支持条目空闲时间并自动删除它们 我知道有guavaMapMaker,但它会在后续读/写操作中终止元素,而不是通过运行线程自动终止元素。此外,MapMaker的过期功能现在被移动到CacheBuilder。问题是,我不想要缓存——我想要过期的元素 有现成的吗?(自己实现并不困难,但最好重用一些东西)也许: 而不是。。。它有许多未解析的导入。如果没有其他内容,您可以提供一个只抛出异常的虚拟缓存加载程序,然后不调用缓存。get--只与asMap视图交互。这并不漂亮,但我

我需要一个
映射
(或任何集合),它支持条目空闲时间并自动删除它们

我知道有guava
MapMaker
,但它会在后续读/写操作中终止元素,而不是通过运行线程自动终止元素。此外,
MapMaker
的过期功能现在被移动到
CacheBuilder
。问题是,我不想要缓存——我想要过期的元素

有现成的吗?(自己实现并不困难,但最好重用一些东西)

也许:

而不是。。。它有许多未解析的导入。

如果没有其他内容,您可以提供一个只抛出异常的虚拟
缓存加载程序
,然后不调用
缓存。get
--只与
asMap
视图交互。这并不漂亮,但我们正在努力在11.0中更好地支持这个案例。如果你尝试这个,一定要吃番石榴10.0.1


是的,
Cache.cleanUp
随时可以从您想要的线程调用。

Apache Mina的ExpiringMap正是您想要的


我建议使用Hazelcast提供的
地图。它还提供分布式功能,但您可能对它们不感兴趣。您只需配置过期策略(
time to live seconds
max idle seconds
)并使用
Map
,就像Java的
HashMap
将要过期一样


更多信息可在此处找到:

您是否需要元素以某种方式及时明确“死亡”(例如通过调用某个方法)?如果您只需要丢弃过期的元素,那么在访问时检查元素的时间戳就足够了。您可以让正在运行的线程定期调用Cache.cleanup()来触发过期项的逐出。虽然不是即时的,但是一个正在运行的线程在内部有太多的限制(不兼容J2EE/GAE,有狗堆效应等)。@Ben Manes感谢您的建议。但是我不喜欢缓存接口。首先,它强制您指定值计算。我不需要那个。如果我返回null,它将抛出一个NPE。这是因为它总是调用getOrCompute,我只需要像一个简单的地图一样获取。然后,即使抓到了NPE,我也无法让它工作(也许是我的错),但它总是会使条目过期,即使它们被访问。这是公平的。对于加载程序返回null是否正常(例如缓存未命中)存在争议。由于放松约束比添加约束更容易,因此在删除@Beta状态之前可能会发生变化。您可以使用cache.asMap()来使用缓存的映射视图,其中get()将不计算并允许写入(在10.0.1中)。@Ben Manes是的,但这不会刷新访问权限,项目将过期。这是一个(旧的)演示教程,而不是提供的库,因此未解析的导入似乎是公平的。这是一种幼稚而普遍的做法。我更喜欢我们添加到Guava中的摊销方法,因为它避免了陈旧事件的堆积。我尝试过,但是
asMap
视图交互不会刷新最后访问。仅链接的答案不是最好的答案。你能通过提供一个小的代码示例来扩展它吗。它可以根据创建或访问时间使条目过期。