java – 如何运行后台线程定期清理列表中的某些元素?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何运行后台线程定期清理列表中的某些元素?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1470字,纯文字阅读大概需要3分钟。
内容图文
我目前正在实施缓存.我已完成基本实现,如下所示.我想要做的是运行一个线程,删除满足特定条件的条目.
class Cache {
int timeLimit = 10; //how long each entry needs to be kept after accessed(marked)
int maxEntries = 10; //maximum number of Entries
HashSet<String> set = new HashSet<String>();
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 – 如何运行后台线程定期清理列表中的某些元素?全部内容,希望文章能够帮你解决java – 如何运行后台线程定期清理列表中的某些元素?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。