有失效的标记
public class AgingMark<K> {
//标记map
private final ConcurrentHashMap<K,Long> markMap = new ConcurrentHashMap(1);
// 刷新标记事件
public void refreshMark(K k, int time, TimeUnit timeUnit) {
markMap.put(k, System.currentTimeMillis() + timeUnit.toMillis(time));
}
// 移出标记
public boolean reomveMark(K k) {
return markMap.remove(k) != null;
}
// 检测使用拥有指定标记
public boolean hasMark(K k) {
Long time = markMap.get(k);
if(time == null) {
return false;
}
}
// 是否没有任何标记
public boolean isEmpty() {
return markMap.isEmpty();
}
// 是否没有任何标记
public void tryRemoveExpire(Consumer<K> consumer) {
if(markMap.isEmpty()) {
return;
}
long now = System.currentTimeMillis();
markMap.entrySet().removeIf(k -> {
// 注意,这里是先执行回调后后移出
if(k.getValue() < now) {
if(consumer != null) {
consumer.accept(k.getKey())
}
return ture;
} else {
return false;
}
});
}
// 获取指定key的过期时间
public long getExpireTime(K k) {
Long time = markMap.get(k);
if(time == null) {
return 0;
}
long expire = time - System.currentTimeMillis();
if(expire <= 0) {
markMap.remove(k);
return 0;
}
}
// 当前拥有的所有key
public Set<K> returnKeysAndClear() {
Set<K> keys = new HashSet<>(markMap.keySet());
markMap.clear();
return keys;
}
// 清除所有标记
public void clear() {
markMap.clear();
}
// 遍历所有未过期的标记
public void walkAll(BiConsumer<K,Long> walker) {
markMap.keySet().foreach(
k -> {
long expire = getExpireTime(k);
if(expire > 0) {
walker.accept(k, expire);
}
}
);
}
// 注意,该接口返回的数量,只是当前标记集合数据的数量,不代表当前还未过去的标记数量
public int size() {
return markMap.size();
}
}