Google Guava教程称缓存过期可以用
Ticker进行测试
根据我的理解,我可以用它来强制快速过期.我对吗?
但我试过以下代码,它没有用,有什么建议吗?
@Test public void expireAfterWriteTestWithTicker() throws InterruptedException { Ticker t = new Ticker() { @Override public long read() { return TimeUnit.MILLISECONDS.toNanos(5); } }; //Use ticker to force expire in 5 millseconds LoadingCache<String,String> cache = CacheBuilder.newBuilder() .expireAfterWrite(20,TimeUnit.MINUTES).ticker(t).build(loader); cache.getUnchecked("hello"); assertEquals(1,cache.size()); assertNotNull(cache.getIfPresent("hello")); //sleep Thread.sleep(10); assertNull(cache.getIfPresent("hello")); //Failed }
解决方法
只要自己找到答案
Ticker可用于跳过时间,但不能用于到期时间
class FakeTicker extends Ticker { private final AtomicLong nanos = new AtomicLong(); /** Advances the ticker value by {@code time} in {@code timeUnit}. */ public FakeTicker advance(long time,TimeUnit timeUnit) { nanos.addAndGet(timeUnit.toNanos(time)); return this; } @Override public long read() { long value = nanos.getAndAdd(0); System.out.println("is called " + value); return value; } }
@Test public void expireAfterWriteTestWithTicker() throws InterruptedException { FakeTicker t = new FakeTicker(); // Use ticker to force expire in 20 minute LoadingCache<String,TimeUnit.MINUTES).ticker(t).build(ldr); cache.getUnchecked("hello"); assertEquals(1,cache.size()); assertNotNull(cache.getIfPresent("hello")); // add 21 minutes t.advance(21,TimeUnit.MINUTES); assertNull(cache.getIfPresent("hello")); }