zoukankan      html  css  js  c++  java
  • 30秒缓存

    缓存类:

    package test;

    import java.util.AbstractMap;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;

    /**
    * 用来存储短暂对象的缓存类,实现Map接口,内部有一个定时器用来清除过期(30秒)的对象。
    * 为避免创建过多线程,没有特殊要求请使用getDefault()方法来获取本类的实例。
    * 此代码来源于互联网
    * @param <K>
    * @param <V>
    */

    public class CacheMap<K, V> extends AbstractMap<K, V> {
    //过期时间为30秒
    private static final long DEFAULT_TIMEOUT = 30000;
    private static CacheMap<Object, Object> defaultInstance;

    public static synchronized final CacheMap<Object, Object> getDefault() {
    if (defaultInstance == null) {
    defaultInstance = new CacheMap<Object, Object>(DEFAULT_TIMEOUT);
    }
    return defaultInstance;
    }

    private class CacheEntry implements Entry<K, V> {
    long time;
    V value;
    K key;

    CacheEntry(K key, V value) {
    super();
    this.value = value;
    this.key = key;
    this.time = System.currentTimeMillis();
    }

    @Override
    public K getKey() {
    return key;
    }

    @Override
    public V getValue() {
    return value;
    }

    @Override
    public V setValue(V value) {
    return this.value = value;
    }
    }

    private class ClearThread extends Thread {
    ClearThread() {
    setName("clear cache thread");
    }

    public void run() {
    while (true) {
    try {
    long now = System.currentTimeMillis();
    Object[] keys = map.keySet().toArray();
    for (Object key : keys) {
    CacheEntry entry = map.get(key);
    if (now - entry.time >= cacheTimeout) {
    synchronized (map) {
    map.remove(key);
    }
    }
    }
    Thread.sleep(cacheTimeout);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }

    private long cacheTimeout;
    private Map<K, CacheEntry> map = new HashMap<K, CacheEntry>();

    public CacheMap(long timeout) {
    this.cacheTimeout = timeout;
    new ClearThread().start();
    }

    @Override
    public Set<Entry<K, V>> entrySet() {
    Set<Entry<K, V>> entrySet = new HashSet<Map.Entry<K, V>>();
    Set<Entry<K, CacheEntry>> wrapEntrySet = map.entrySet();
    for (Entry<K, CacheEntry> entry : wrapEntrySet) {
    entrySet.add(entry.getValue());
    }
    return entrySet;
    }

    @Override
    public V get(Object key) {
    CacheEntry entry = map.get(key);
    return entry == null ? null : entry.value;
    }

    @Override
    public V put(K key, V value) {
    CacheEntry entry = new CacheEntry(key, value);
    synchronized (map) {
    map.put(key, entry);
    }
    return value;
    }
    }

    调用缓存类:

    package test;

    /**
    * 调用步骤:
    * 1:向缓存类中存放一个key和Value
    * 2:30秒之前使用get(key)取出的是value
    * 3:30秒后使用get(key)取出的是null
    * @author xuming
    *
    */
    public class run {

    public static void main(String[] args) {
    //实例化CacheMap方法
    CacheMap c = CacheMap.getDefault();
    c.put("k1","v1");
    //存放时的时间戳
    double currentTime =System.currentTimeMillis();
    for(int i = 0;i<500000;i++){
    //当前的时间差---获取get(key)
    System.out.println((System.currentTimeMillis()-currentTime)/10000+"秒---"+c.get("k1"));
    }
    }

    }

  • 相关阅读:
    Android客户端与PCServer端socket通信加密方法
    Android的进程优先级与进程回收
    Android学习下载网络图片
    Java Socket通信实现文件传输/图片传输
    python 知识整理
    vmware 安装 centos8 步骤
    mysql 开启事务的 sql 写法
    团队项目七天冲刺 第二天
    测试的计划和执行
    Contentdisposition
  • 原文地址:https://www.cnblogs.com/Xmingzi/p/7886722.html
Copyright © 2011-2022 走看看