package com.xiaoleilu.hutool.cache.impl;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;
/**
* 定时缓存<br>
* 此缓存没有容量限制,对象只有在过期后才会被移除
*
* @author Looly
*
* @param <K> 键类型
* @param <V> 值类型
*/
public class TimedCache<K, V> extends AbstractCache<K, V> {
/** 定时器 */
protected Timer pruneTimer;
/**
* 构造
*
* @param timeout 过期时长
*/
public TimedCache(long timeout) {
this.capacity = 0;
this.timeout = timeout;
cacheMap = new HashMap<K, CacheObj<K, V>>();
}
// ---------------------------------------------------------------- prune
/**
* 清理过期对象
* @return 清理数
*/
@Override
protected int pruneCache() {
int count = 0;
Iterator<CacheObj<K, V>> values = cacheMap.values().iterator();
CacheObj<K, V> co;
while (values.hasNext()) {
co = values.next();
if (co.isExpired()) {
values.remove();
count++;
}
}
return count;
}
// ---------------------------------------------------------------- auto prune
/**
* 定时清理
* @param delay 间隔时长
*/
public void schedulePrune(long delay) {
if (pruneTimer != null) {
pruneTimer.cancel();
}
pruneTimer = new Timer();
pruneTimer.schedule(new TimerTask(){
@Override
public void run() {
prune();
}
}, delay, delay);
}
/**
* 取消定时清理
*/
public void cancelPruneSchedule() {
if (pruneTimer != null) {
pruneTimer.cancel();
pruneTimer = null;
}
}
}