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"));
}
}

}

原文地址:https://www.cnblogs.com/Xmingzi/p/7886722.html