手动实现一个LUR

LRU全称是Least Recently Used,即最近最久未使用的意思

package com.gooagoo.market.common.util;import java.util.PriorityQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** Created by zhangkun on 2020/5/23.*/
public class LUR {private static ScheduledExecutorService scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(10);private static ConcurrentHashMap<String,Node> cache = new ConcurrentHashMap<>(1024);private static PriorityQueue<Node> expireQueue = new PriorityQueue(1024);public LUR(){scheduledThreadPoolExecutor.scheduleWithFixedDelay(new ExpireNode(),3,3, TimeUnit.SECONDS);}public class ExpireNode implements  Runnable{@Overridepublic void run() {//获取当前时间long curTime= System.currentTimeMillis();while(true){Node node = expireQueue.peek();// 队列获取头部元素 为空  或者不过期则返回if(node == null||node.getExpireTime()>curTime){return;}// 过期则从缓存中删除 并且从队列中弹出cache.remove(node.getKey());expireQueue.poll();}}}public Object set(String key,Object value,long ttl){//获取过期时间点long expireTime = System.currentTimeMillis()+ttl;Node newNode = new Node(key,value,expireTime);Node oldNode = cache.get(key);//cache 有的话就覆盖 没有的话就添加新的cache.put(key,newNode);expireQueue.offer(newNode);if(oldNode!=null){expireQueue.remove(oldNode);return oldNode.getValue();}return  null;}public Object get(String key){Node node = cache.get(key);if(node!=null){return node.getValue();}return null;}}
package com.gooagoo.market.common.util;import org.apache.xmlbeans.impl.xb.xsdschema.Public;/*** Created by zhangkun on 2020/5/23.*/
public class Node implements Comparable<Node> {public String getKey() {return key;}public void setKey(String key) {this.key = key;}public Object getValue() {return value;}public void setValue(Object value) {this.value = value;}public long getExpireTime() {return expireTime;}public void setExpireTime(long expireTime) {this.expireTime = expireTime;}private String key;private Object value;private long expireTime;public Node(String key,Object value,long expireTime) {this.key = key;this.value = value;this.expireTime = expireTime;}@Overridepublic int compareTo(Node o) {long time = this.expireTime - o.expireTime;if(time>0){return 1;}if(time<0){return -1;}return 0;}
}

java多线程复习与巩固(六)相关推荐

  1. Java多线程复习_Java多线程复习

    一.线程的基本概念 简单的说:线程就是一个程序里不同的执行路径 在同一个时间点上cpu只会有一个线程在执行 Java里的多线程是通过java.lang.Thread类来实现的 每个线程都拥有自己独立的 ...

  2. Java多线程学习三十六:主内存和工作内存的关系

    CPU 有多级缓存,导致读的数据过期 由于 CPU 的处理速度很快,相比之下,内存的速度就显得很慢,所以为了提高 CPU 的整体运行效率,减少空闲时间,在 CPU 和内存之间会有 cache 层,也就 ...

  3. Java多线程学习二十六:原子类是如何利用 CAS 保证线程安全的?

    什么是原子类,以及它有什么作用. 在编程领域里,原子性意味着"一组操作要么全都操作成功,要么全都失败,不能只操作成功其中的一部分".而 java.util.concurrent.a ...

  4. Java多线程复习:5(sleep、yield方法和线程优先级)

    sleep.yield方法和线程优先级 sleep方法 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞): 其它线程可以使用 interrupt 方法打 ...

  5. Java多线程复习:3(在操作系统中查看和杀死进程线程)

    此博客是记录自己学习过程的记录,仅做参考 Windows下查看和杀死进程线程 查看所有进程 tasklist 查看指定关键字的进程 tasklist | findstr + 关键字 Java程序运行的 ...

  6. Java多线程复习:2(线程的创建和使用)

    线程的创建和使用 方法一,直接使用Thread import lombok.extern.slf4j.Slf4j; /*** @author:小关同学爱吃汉堡* @date: 2021/4/1 23: ...

  7. Java多线程复习:1(进程和线程、并发和并行)

    进程和线程 进程 我们电脑中每一个运行着的程序都是一个进程,程序一旦运行就是进程. 进程可以视为程序的一个实例,大部分程序可以同时运行多个实例进程(如:浏览器.记事本.画图等),也有的程序只能启动一个 ...

  8. Java多线程复习整理(二)

    目录 1. 线程的五种状态(操作系统层面)? 2.线程的状态(JAVA层面)? 3.. 线程相关的基本方法? 4. wait()和sleep()的区别? 5.sleep()方法和yield()方法区别 ...

  9. java多线程复习与巩固(三)

    Java中线程的状态分为6种. 新建(NEW):新创建的一个线程对象. 可运行(RUNNABLE):也叫就绪状态.线程对象创建后,其他线程(比如main线程)调用该线程的start 方法.该状态的线程 ...

最新文章

  1. Python实战案例,CV2模块,Python实现抖音字符视频
  2. python 高阶函数
  3. MaxCompute JDBC 2.2 发布说明
  4. lua编程简单实用入门教程,用NodeMCU在OLED上显示温湿度
  5. 小议H.264技术发展趋势
  6. online游戏服务器架构—用户登录数据组织 .
  7. Win7旗舰版系统hosts文件位置在哪里
  8. 【Python】字符串(String)
  9. python赋值标志_Python中的赋值、引用和深浅拷贝
  10. 开源直播OBS ( Open Broadcaster Software ) 多机位,多场景切换
  11. 用 PHP 来玩直播猜题小游戏,一起 happy coding.
  12. 云计算项目实战——系统API模块
  13. 如何创建C语言的项目
  14. kodi pvr 不能安装_Kodi添加m3u8直播源教程 使用PVR IPTV Simple Client看电视直播
  15. MSVAR能用MATLAB做吗,MS-VAR模型(MSVAR)建模心得(干货)
  16. SaaSpace:11种最佳免费会计软件工具
  17. ov5640_rgmii_udp
  18. 表情识别论文《OAENet Oriented Attention Ensemble for Accurate FacialExpression Recognition》中文翻译
  19. Windows10去除桌面快捷方式小箭头
  20. KY261 Jugs

热门文章

  1. 《计算机网络:自顶向下方法》读书笔记 1:概论
  2. unity脚本用vs打开没有代码提示功能
  3. Microsoft PowerToys --- win系统中非常好用的工具箱
  4. C4D样条点插值都是些什么意思?
  5. mp4要整个下载完才能播放的问题
  6. 用STM32读取6轴角度传感器JY61的陀螺仪、加速度、角度数据MPU6050
  7. 5、碧蓝天加盟商如何招学员和收款.txt
  8. 如何解决“Linux解压zip文件报错‘-bash: unzip: 未找到命令’”?
  9. 过口译必备——口译速记符号归总!(完全版!)
  10. 芝诺悖论-阿基里斯与龟