我尝试使用ExpringMap自动使地图对象过期。这是我第一次使用这个罐子,我知道有一种流行的番石榴,但我不需要缓存,我也不知道如何使用番石榴。
我碰巧知道mina项目中的ExpiringMap,所以我在下面测试了它,但它没有用。那是为什么?
我希望在几分钟后能够以高效且易于使用的方式从地图中删除我的对象。任何身体能给我一个例子吗?谢谢!
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++;
}
输出结果是对象仍在地图中
----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
答案 0 :(得分:3)
get导致重置参考时间,因此永远不会发生超时。 map2是边界线,因为时间是2秒,检查间隔是1秒。所以它可以歪斜到差不多3秒,而不是超时,我想再读一遍。尝试先将睡眠放在首位,然后尝试将每个循环延长3秒,看看会发生什么。
在事情开始到期之前,还需要添加以下行:
map2.getExpirer().startExpiring();
map10.getExpirer().startExpiring();
map5.getExpirer().startExpiring();
表示2秒到期。其他两个映射不会,因为引用之间的间隔对于当前代码来说永远不够长。