是否guava缓存的removeListener在一个单独的线程中运行?

时间:2017-03-15 12:46:14

标签: guava google-guava-cache

我想在从番石榴缓存中删除对象时执行一些清理。 但我需要在一段时间后这样做。 我可以睡觉吗? 它会阻止所有线程吗? 或者removeListener在一个单独的线程中运行?

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

1 个答案:

答案 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();