在延迟队列中所保存的每一个元素内容.每当时间一到,(compareTo进行比较,getDelay()获取延迟时间),都会自动进行队里数据的弹出操作;
使用延迟队列(模拟讨论会依次离开的场景)

public class Student implements Delayed {//姓名private String name;//离开时间private long expire;//停留时间private long delay;public Student(String name,long delay,TimeUnit unit){this.name = name;//转换时间单位为毫秒this.delay = TimeUnit.MILLISECONDS.convert(delay,unit);//失效时间计算this.expire = System.currentTimeMillis() + this.delay;}public String toString() {return this.name + "同学已经达到预计的停留时间"+TimeUnit.SECONDS.convert(this.delay,TimeUnit.MILLISECONDS)+"秒,已经离开了";}/*** 队列弹出计算* @param o* @return*/@Overridepublic int compareTo(Delayed o) {int i = (int) (this.delay - this.getDelay(TimeUnit.MILLISECONDS));return i;}/***延迟时间计算* @param* @return*/@Overridepublic long getDelay(TimeUnit unit) {long convert = unit.convert(this.expire - System.currentTimeMillis(), TimeUnit.MILLISECONDS);return convert;}
}
public class JUCDemo {public static void main(String[] args) throws InterruptedException {//定义延迟队列BlockingQueue<Student> queue = new DelayQueue<>();//保存队列信息queue.put(new Student("李",3, TimeUnit.SECONDS));queue.put(new Student("王",5,TimeUnit.SECONDS));//判断队列是否有数据while (!queue.isEmpty()){//获取弹出数据Student take = queue.take();System.out.println(take);TimeUnit.SECONDS.sleep(1);}}
}

输出结果:

李同学已经达到预计的停留时间3秒,已经离开了
王同学已经达到预计的停留时间5秒,已经离开了

使用延迟队列的主要原因是它可以实现队列的定时清理操作.那么基于这样的自动清理机制就可以实现数据缓存的操作控制.这样的操作可以极大的提升项目的并发性能;
(在时间开发中,如果是基于数据库的查询操作,那么在多线并发量较高的情况下就有可能产生严重的性能问题,例如一个热门新闻可能会有上千万的访问量,这个时候采用直接数据库的读取模式就非常不理智.为了解决这一的问题,可以采用缓存模式,将一些重要的数据直接放到缓存里面.当不同的线程查询相同数据时先判断缓存中是否有指定内容,如果存在,则进行直接读取,如果不存在,再进行数据库加载.对于缓存中的内容还要考虑无效数据的清理问题,而有了延迟队列这种自动弹出的机制存在.这一操作实现就会变得非常容易)

下面实现一个新闻数据的缓存操作,考虑到可能会保存有多个数据,所以讲通过Map集合实现存储,同时考虑到缓存数据的修改安全性问题,使用ConcurrentHashMap子类,另外对于数据的弹出操作将通过守护线程进行处理.

public class News {private long nid;private String title;public News(long nid, String title){this.nid = nid;this.title = title;}public String toString(){return "新闻数据---->编号:"+this.nid+",标题:"+title;}
}
public class Cache<K,V> {//时间单位private static final TimeUnit TIME = TimeUnit.SECONDS;//缓存时间private static final long DELAY_SECONDS = 2;//缓存集合private Map<K,V> cacheObjects = new ConcurrentHashMap<>();private BlockingQueue<DelayedItem<Pair>> queue = new DelayQueue<>();//启动线程public Cache(){Thread thread = new Thread(()->{while (true){try{//数据弹出消费DelayedItem<Pair> item = Cache.this.queue.take();if (item != null){//获取内容Pair pair = item.getItem();//删除数据Cache.this.cacheObjects.remove(pair.key,pair.value);}}catch (Exception e){}}});thread.setDaemon(true);thread.start();}/*** 保存数据* @param key* @param value*/public void put(K key,V value) throws InterruptedException {V oldValue= this.cacheObjects.put(key,value);//删除已有数据if (oldValue != null){this.queue.remove(oldValue);}//重新保存this.queue.put(new DelayedItem<Pair>(new Pair(key,value),DELAY_SECONDS,TIME));}/*** 获取缓存数据* @param key* @return*/public V get(K key){return this.cacheObjects.get(key);}/*** 封装保存数据*/private class Pair{private K key;private V value;public Pair(K key,V value){this.key = key;this.value = value;}}/*** 延迟数据保存* @param <T>*/private class DelayedItem<T> implements Delayed{private T item;private long delay;private long expire;public DelayedItem(T item,long delay,TimeUnit unit){this.item = item;this.delay = TimeUnit.MILLISECONDS.convert(delay,unit);this.expire = System.currentTimeMillis() + this.delay;}public T getItem(){return this.item;}@Overridepublic long getDelay(TimeUnit unit) {return unit.convert(this.expire - System.currentTimeMillis(),TimeUnit.MILLISECONDS);}@Overridepublic int compareTo(Delayed o) {return (int)(this.delay - this.getDelay(TimeUnit.MILLISECONDS));}}}
public class JUCDemo2 {public static void main(String[] args) throws InterruptedException {Cache<Long,News> cache = new Cache<>();cache.put(1L,new News(1L,"程序员为什么秃"));cache.put(2L,new News(2L,"程序员为什么宅"));cache.put(3L,new News(3L,"程序员为什么扣"));System.out.println(cache.get(1L));System.out.println(cache.get(2L));//模拟延迟时间.2秒后清除缓存TimeUnit.SECONDS.sleep(3);System.out.println(cache.get(3L));}
}

输出结果:

新闻数据---->编号:1,标题:程序员为什么秃
新闻数据---->编号:2,标题:程序员为什么宅
null

在程序中考虑到缓存数据的自动清理问题,所以使用了延迟队列保存所以的数据信息(同时还有一份数据信息保存在Map集合中),为了保证延迟队列中的数据弹出后可以进行Map集合相应数据的删除.所以定义了一个守护线程接收延迟队列弹出的内容.由于本程序设置了默认的缓存时间为2秒,这样当2秒一过数据就会被删除.

JAVA延迟队列(实现数据的缓存和定时清理)相关推荐

  1. java延迟队列,java高级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  2. JAVA实现HASHMAP缓存 并定时清理

    背景:需要记录小程序用户登陆的sessionid并与其openid关联,定时清除 核心代码实现 总体思路:使用ConcurrentHashMap去存缓存的对象,PriorityBlockingQueu ...

  3. Linux 清理缓存,定时清理缓存脚本

    查看内存使用率 free -m | sed -n '2p' | awk '{print "used mem is "$3"M,total mem is "$2& ...

  4. php 定时缓存,php定时清理缓存文件的简单示例

    这篇文章主要为大家详细介绍了php定时清理缓存文件的简单示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!那么有没有方法自动清理临时文件夹呢? 以下代 ...

  5. 微服务架构下静态数据通用缓存机制

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 |  my.oschina.net/u/3971241/bl ...

  6. 微服务架构下,静态数据通用缓存机制!

    本文转自:波斯码 链接:https://blog.bossma.cn/architecture/microservice-business-static-data-universal-cache-me ...

  7. 微服务架构下的静态数据通用缓存机制!

    什么是静态数据 为什么需要缓存 通用缓存机制 总结 后记 在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验 ...

  8. java 延时队列_Java实现简单延迟队列和分布式延迟队列

    在我们的工作中,很多地方使用延迟队列,比如订单到期没有付款取消订单,制订一个提醒的任务等都需要延迟队列,那么我们需要实现延迟队列.我们本文的梗概如下,同学们可以选择性阅读. 1. 实现一个简单的延迟队 ...

  9. Java 消息队列、缓存、同步(个人理解:空谈)

    Java 消息队列.缓存.同步. 消息队列 我的理解:消息队列,将消息存入消息队列,然后就OK了. 系统之间原先调用通用接口,但引入了消息队列后,系统之间调用MQ消息队列. 好处:响应快,能累积请求, ...

最新文章

  1. App.Config 和 WebConfig 特殊字符的转义码对应关系
  2. 使用RMAN VALIDATE验证数据和备份
  3. ASP操作Excel技术总结
  4. Visual Studio LightSwitch初体验和定位看法
  5. IMP-00009:异常结束导出文件解决方案
  6. c语言 程序结集,c语言(结体程序设计).doc
  7. 程序员的自我修养(转载)
  8. Atitit 业务领域体系分类 目录 1. 按照互联网企业类型以及只是体系类的分类 2 2. 电子商务 2 3. **通信类社交 Im类 em 2 4. **信息搜索类爬虫 2 4.1. 媒体
  9. vs 输入代码时出现火花_VSV和VBV随发动机转速和进气温度怎么变化维修执照机务在线...
  10. win10u盘被写保护怎么解除_win10系统下u盘被写保护怎么解除_win10解除u盘写保护方法...
  11. 基尼指数 Gini Index
  12. 如何把团队带成一盘散沙?
  13. 2021年Java开发实战!java开发安卓app的流程
  14. 企业如何选择合适项目管理工具?
  15. linux安装mysql-8.0.26
  16. quick bms的使用
  17. react native 安装插件
  18. VirtualBox使用时卡顿的解决方案(亲测有效)
  19. 基于Java毕业设计仓库管理系统源码+系统+mysql+lw文档+部署软件
  20. 中南财经政法大学计算机考研资料汇总

热门文章

  1. python的常见矩阵运算
  2. 2.1.1Linux网络配置
  3. “大片”火了毁大片,“IP”火了毁IP,现在整个电影圈都在研究什么才是好剧本
  4. 随机数生成器,随机种子
  5. 简述css属性选择器的几种定义方式_CSS属性选择器
  6. 多智能体系统仿真学习笔记:(一)ODE
  7. 数据库系统原理第五节
  8. jQuery获取动态id的办法
  9. 线程池的种类有哪些?
  10. 阿里云数据库专家于巍荣获PostgreSQL中国技术大会“最具价值专家 MVP”奖