我尝试使用 ExpringMap 使 map 对象自动过期。这是我第一次使用这个 jar,我知道有一个 Guava 很受欢迎,但我不需要缓存,我也不知道如何使用 Guava。
而我刚好从mina项目中了解到ExpiringMap,所以在下面进行了测试,但并没有失效。这是为什么?
我希望有一种高性能且易于使用的方法可以在几分钟后从 map 上删除我的对象。任何人都可以给我一个例子吗?谢谢!
ExpiringMap<String, String> map2=new ExpiringMap<String, String>(2,1);
ExpiringMap<String, String> map10=new ExpiringMap<String, String>( 10,1);
ExpiringMap<String, String> map5=new ExpiringMap<String, String>(5,1);
map2.put("1", "1");
map5.put("1","1");
map10.put("1", "1");
map2.put("2", "2");
map5.put("2","2");
map10.put("2", "2");
int n=0;
while(true){
System.out.println("----"+3*n+"seconds----");
Set<String> set2=map2.keySet();
System.out.println("----map2----");
for (String key : set2) {
System.out.println(map2.get(key));
}
Set<String> set5=map5.keySet();
System.out.println("----map5----");
for (String key : set5) {
System.out.println(map5.get(key));
}
Set<String> set10=map10.keySet();
System.out.println("----map10----");
for (String key : set10) {
System.out.println(map10.get(key));
}
Thread.sleep(3000);//sleep 3 seconds
n++;
}
输出很明显对象仍在 map 中
----0seconds----
----map2----
1
2
----map5----
1
2
----map10----
1
2
----3seconds----
----map2----
1
2
----map5----
1
2
----map10----
1
2
----6seconds----
----map2----
1
2
----map5----
1
2
----map10----
1
2
----9seconds----
----map2----
1
2
----map5----
1
2
----map10----
1
2
----12seconds----
----map2----
1
2
----map5----
1
2
----map10----
1
2
最佳答案
get 导致引用时间被重置,因此超时永远不会发生。 map2 是边界线,因为时间是 2 秒,检查间隔是 1 秒。所以我认为它可能会偏斜到将近 3 秒并且在再次读取之前不会超时。尝试将 sleep 放在第一位,然后尝试将其每次循环延长 3 秒,看看会发生什么。
在事物开始过期之前还需要添加以下行:
map2.getExpirer().startExpiring();
map10.getExpirer().startExpiring();
map5.getExpirer().startExpiring();
2 秒结束。其他两个 map 没有,因为引用之间的间隔对于当前代码来说永远不够长。
关于java - ExpiringMap 无法使对象过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24848138/