package com.ibiz.modules.common.util; 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> { 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; } }
最近下载更多
Ben LV1
2021年6月15日
纳兰若水 LV5
2020年10月29日
sawadika_91 LV2
2020年5月27日
weixiao LV6
2020年5月18日
hh22098 LV1
2020年3月12日
qweruiop LV1
2020年3月6日
1822052517 LV1
2019年11月26日
SAN0001 LV3
2019年11月4日
annazhang LV29
2019年9月17日
liuwenxi163 LV2
2019年9月3日
最近浏览更多
CrystalQ LV8
2023年5月30日
Ben LV1
2021年6月15日
zzctest LV1
2021年5月24日
a992013093 LV15
2021年3月2日
dongzhan LV12
2020年12月8日
纳兰若水 LV5
2020年10月29日
hui520
2020年9月23日
暂无贡献等级
gan857569302 LV9
2020年6月22日
feng的微笑 LV4
2020年6月15日
sawadika_91 LV2
2020年5月27日