我尝试使用ExpringMap自动使地图对象失效.这是我第一次使用这个罐子,我知道有一个受欢迎的番石榴,但是我不需要缓存,也不知道怎么使用番石榴.
而且我碰巧知道mina项目中的ExpiringMap,所以我在下面对其进行了测试,但是它没有用.这是为什么?
我希望有一种性能良好且易于使用的方法,可以在几分钟后从地图上删除我的对象.有人能给我一个例子吗?谢谢!
ExpiringMap map2=new ExpiringMap(2,1);
ExpiringMap map10=new ExpiringMap( 10,1);
ExpiringMap map5=new ExpiringMap(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 set2=map2.keySet();
System.out.println("----map2----");
for (String key : set2) {
System.out.println(map2.get(key));
}
Set set5=map5.keySet();
System.out.println("----map5----");
for (String key : set5) {
System.out.println(map5.get(key));
}
Set 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
解决方法:
该get导致将参考时间重置,因此永远不会发生超时. map2是边界线,因为时间是2秒,检查间隔是1秒.因此它可能会倾斜到将近3秒,并且在我再次读取之前不会超时.尝试将睡眠放在第一位,并尝试将每个循环的睡眠时间延长3秒,然后看看会发生什么.
在开始过期之前,还需要添加以下行:
map2.getExpirer().startExpiring();
map10.getExpirer().startExpiring();
map5.getExpirer().startExpiring();
2秒到期.其他两个映射不是因为当前代码在引用之间的间隔永远不会足够长.
标签:apache,map,mina,java
来源: https://codeday.me/bug/20191121/2052094.html