1

当对象从番石榴缓存中删除时,我想执行一些清理。但我需要在一段时间后这样做。我可以在那里睡觉吗?它会阻塞所有线程吗?还是removingListener 在单独的线程中运行?

CacheBuilder.newBuilder().
.removalListener(notification -> {
    try {
        Thread.sleep(10 * 60 * 1000);
    } catch (InterruptedException e) {
    }
    try {
        //close
    } catch (final IOException e) {
    }
})
.build();
4

1 回答 1

5

来自Removal Listeners · CachesExplained · google/guava Wiki

警告:移除监听器操作默认是同步执行的,由于缓存维护是在正常缓存操作期间正常执行的,昂贵的移除监听器会减慢正常的缓存功能!如果您有一个昂贵的删除侦听器,请使用RemovalListeners.asynchronous(RemovalListener, Executor)来装饰 aRemovalListener以异步操作。

例如

Executor executor = Executors.newFixedThreadPool(10);
CacheBuilder.newBuilder()
        .removalListener(RemovalListeners.asynchronous(notification -> {
            Uninterruptibles.sleepUninterruptibly(10, TimeUnit.MINUTES);
            try {
                //close
            } catch (final IOException e) {
            }
        }, executor))
        .build();
于 2017-03-15T13:51:47.953 回答