java中关闭后台线程_java – 如何运行后台线程定期清理列表中的某些元素?

我目前正在实施缓存.我已完成基本实现,如下所示.我想要做的是运行一个线程,删除满足特定条件的条目.

class Cache {

int timeLimit = 10; //how long each entry needs to be kept after accessed(marked)

int maxEntries = 10; //maximum number of Entries

HashSet set = new HashSet();

public void add(Entry t){

....

}

public Entry access(String key){

//mark Entry that it has been used

//Since it has been marked, background thread should remove this entry after timeLimit seconds.

return set.get(key);

}

....

}

我的问题是,我应该如何实现后台线程,以便线程绕过集合中的条目并删除已标记为&&的条目. (上次访问时间 – 现在)> timeLimit?

编辑

上面只是代码的简化版本,我没有写同步语句.

解决方法:

你为什么重新发明轮子? EhCache(以及任何体面的缓存实现)将为您完成此任务.来自Guava的更轻量级的MapMaker Cache也可以自动删除旧条目.

如果你真的想自己实现它,那就不是那么简单了.

>记住同步.您应该使用ConcurrentHashMap或synchronized关键字来存储条目.这可能真的很棘手.

>您必须以某种方式存储每个条目的最后访问时间.每次访问条目时,都必须更新该时间戳.

>考虑驱逐政策.如果缓存中有多个maxEntries,首先要删除哪些?

>你真的需要一个后台线程吗?

这是令人惊讶的,但EhCache(企业就绪且经过验证)不使用后台线程来使旧条目无效).相反,它会等到地图已满并懒惰地删除条目.这看起来是一个很好的权衡,因为线程很昂贵.

>如果你有一个后台线程,那么每个缓存还是一个全局?您是在创建新缓存时启动新线程还是拥有所有缓存的全局列表?这比你想象的要难……

一旦你回答了所有这些问题,实现就相当简单了:每隔一秒左右查看所有条目,如果满足你已编写的条件,则删除条目.

标签:java

来源: https://codeday.me/bug/20190726/1539917.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值