现在我只是想知道为什么,prob也需要帮助。
因此,当我向列表中添加值时,它将被添加,但5分钟后它将被删除,这是可行的,但如果我添加list.size(),它仍然显示1,但里面没有值
public class Test extends Runnable {
private ExpiringSet<User> users; //User is just my object class
public Test() {
users = new ExpiringSet<User>(5, TimeUnit.MINUTES); //Sets the users
users.add(new User("John"));
}
@Override
public void run() {
// This will always say 1 even after i wait 1hour ive seen it has increased after a while then it said 2
//and there is no values in the users
System.out.println("Size: " + users.size());
//But this is empty after 5min
for(Iterator<User> iter = users.iterator(); iter.hasNext(); ) {
User user = (User)iter.next();
System.out.println("User " + user.getName());
}
}
}
public class ExpiringSet<E> extends ForwardingSet<E> {
private final Set<E> setView;
public ExpiringSet(long duration, TimeUnit unit) {
Cache<E, Boolean> cache = CaffeineFactory.newBuilder().expireAfterAccess(duration, unit).build();
this.setView = Collections.newSetFromMap(cache.asMap());
}
@Override
protected Set<E> delegate() {
return this.setView;
}
}
基本上我只希望users.size()在用户内部没有值的情况下为0。当它说1并且没有值的时候看起来很奇怪。
1条答案
按热度按时间epfja78i1#
默认情况下,在例行维护期间,过期条目会被延迟删除,这是由几次读取或一次写入触发的。这将导致基础Map的大小被公开,而如果稍后查询并逐出,则条目将被隐藏。这个
Cache.cleanUp()
可以调用运行维护工作。如果希望无论缓存活动如何都能立即删除过期的条目,则需要后台线程。这可以通过配置
Scheduler
在建筑工人身上。Java9+包含一个内置的jvm范围的调度线程,而不是一个新的线程,所以缓存可以配置为,