java - ExpiringMap 无法使对象过期

标签 java dictionary apache-mina

我尝试使用 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/

相关文章:

java - servlet 过滤器中的 URL 映射问题

java - 生成 X.509 证书并使用此证书签署电子邮件

python - 使用 QTreeView 编辑字典

python - 迭代字典,添加键和值

Ruby 哈希数组;只保留包含特定键=>值对的第一个元素

java - 识别 session 超时

java - Apache Mina SSHD 端口转发,如 NGROK

java - 如何向 ioBuffer 分配和检索无符号 Long 值

Android + Apache MINA 在 session.write() 之后不运行 messageSent()

java - java "stringtokenizer.nextToken(delimiter); "是如何工作的?