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 {
private final map m_objects;
private final map 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());
m_expiredobjects = collections.synchronizedmap(new hashmap());
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 get(final string name, final class type) {
return (r) get(name);
}
}