HashMap → CometHashMap なら、当然、TreeMap に対するものも。。。
しかし、残念ながら、コンストラクタが2個あるので、CpmetHashMapのように、
Google guice インジェクトには対応はできない。
import java.util.Calendar;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.Timer;
import java.util.TimerTask;
import java.util.TreeMap;
import java.util.Map.Entry;
/**
* CometTreeMap.
*/
public class CometTreeMap<K,V> extends TreeMap<K,V>{
private static final long serialVersionUID = 1L;
private Timer timer;
private CometMapper ticket;
long checkTime;
Map<String,Long> hmap;
/**
* コンストラクタ.
* 自然順序付に従う
* @param checkTime 削除する時間間隔 msec
* @param ticket 任意の処理
*/
public CometTreeMap(long checkTime,CometMapper ticket){
super();
this.ticket = ticket;
this.hmap = new HashMap<String,Long>();
this.timer = new Timer("CometTreeMap");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND,1);
cal.clear(Calendar.MILLISECOND);
this.timer.scheduleAtFixedRate(new _Reseter(),cal.getTime(),checkTime);
}
/**
* コンストラクタ.
* @param c Comparator
* @param checkTime 削除する時間間隔 msec
* @param ticket 任意の処理
*/
public CometTreeMap(Comparator<? super K> c,long checkTime,CometMapper ticket){
super(c);
this.ticket = ticket;
this.timer = new Timer("CometHashMap");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND,1);
cal.clear(Calendar.MILLISECOND);
this.timer.scheduleAtFixedRate(new _Reseter(),cal.getTime(),checkTime);
}
/*
* @see java.util.HashMap#put(java.lang.Object, java.lang.Object)
*/
@Override
public V put(K key,V value){
return this._put(key,value);
}
@SuppressWarnings("unchecked")
private synchronized V _put(K key,V value){
this.hmap.put(key.toString(),System.currentTimeMillis());
boolean b = super.containsKey(key) ? false : true;
V v = super.put(key,value);
if (b) this.mapper.checkIn(key,value);
return v;
}
class _Reseter extends TimerTask{
private SortedMap<Long,String> smap;
_Reseter(){
this.smap = new TreeMap<Long,String>(
new Comparator<Long>(){
@Override
public int compare(Long l1,Long l2){
return l1.compareTo(l2) >= 0 ? 1 : -1;
}
}
);
}
/*
* @see java.util.TimerTask#run()
*/
@Override
public void run(){
if (CometTreeMap.this.hmap.size()==0) return;
this.smap.clear();
for(Entry<String,Long> e : CometTreeMap.this.hmap.entrySet()){
this.smap.put(e.getValue(),e.getKey());
}
for(String key : this.smap.headMap(System.currentTimeMillis() - CometTreeMap.this.checkTime).values()){
CometTreeMap.this.hmap.remove(key);
CometTreeMap.this.remove(key);
}
}
}
public void close(){
try{
this.finalize();
}catch(Throwable e){
}finally{
this.timer.cancel();
}
}
/*
* @see java.lang.Object#finalize()
*/
@Override
protected void finalize() throws Throwable{
this.timer.cancel();
super.finalize();
}
}