import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class SimpleCache<T> { private final Map<String, T> m_objects; private final Map<String, Long> m_expiredObjects; private final long m_lExpireTime; private final ExecutorService m_executor; public SimpleCache() { this(500); } public SimpleCache(final int nExpireTime) { m_objects = Collections.synchronizedMap(new HashMap<String, T>()); m_expiredObjects = Collections.synchronizedMap(new HashMap<String, Long>()); m_lExpireTime = nExpireTime; m_executor = Executors.newFixedThreadPool(256); Executors.newScheduledThreadPool(5).scheduleWithFixedDelay(RemoveExpiredObjects(), m_lExpireTime / 2, m_lExpireTime, TimeUnit.SECONDS); } private final Runnable RemoveExpiredObjects() { return new Runnable() { public void run() { for (final String name : m_expiredObjects.keySet()) { if (System.currentTimeMillis() > m_expiredObjects.get(name)) { m_executor.execute(CreateRemoveRunnable(name)); } } } }; } private final Runnable CreateRemoveRunnable(final String name) { return new Runnable() { public void run() { m_objects.remove(name); m_expiredObjects.remove(name); } }; } public long GetExpireTime() { return m_lExpireTime; } public void Put(final String name, final T obj) { Put(name, obj, m_lExpireTime); } public void Put(final String name, final T obj, final long expireTime) { m_objects.put(name, obj); m_expiredObjects.put(name, System.currentTimeMillis() + expireTime * 1000); } public T Get(final String name) { final Long expireTime = m_expiredObjects.get(name); if (expireTime == null) return null; if (System.currentTimeMillis() > expireTime) { m_executor.execute(CreateRemoveRunnable(name)); return null; } return m_objects.get(name); } @SuppressWarnings("unchecked") public <R extends T> R Get(final String name, final Class<R> type) { return (R) Get(name); } }