我想在从番石榴缓存中删除对象时执行一些清理。 但我需要在一段时间后这样做。 我可以睡觉吗? 它会阻止所有线程吗? 或者removeListener在一个单独的线程中运行?
CacheBuilder.newBuilder().
.removalListener(notification -> {
try {
Thread.sleep(10 * 60 * 1000);
} catch (InterruptedException e) {
}
try {
//close
} catch (final IOException e) {
}
})
.build();
答案 0 :(得分:5)
来自Removal Listeners · CachesExplained · google/guava Wiki:
警告:默认情况下,删除侦听器操作是同步执行的,并且由于缓存维护通常在正常缓存操作期间执行,因此昂贵的删除侦听器可能会降低正常的缓存功能!如果您有一个昂贵的删除侦听器,请使用
RemovalListeners.asynchronous(RemovalListener, Executor)
来装饰RemovalListener
以异步操作。
e.g。
Executor executor = Executors.newFixedThreadPool(10);
CacheBuilder.newBuilder()
.removalListener(RemovalListeners.asynchronous(notification -> {
Uninterruptibles.sleepUninterruptibly(10, TimeUnit.MINUTES);
try {
//close
} catch (final IOException e) {
}
}, executor))
.build();