2017-03-15 11 views
0

オブジェクトがグアバキャッシュから削除されたときに何らかのクリーニングを実行したい。 しかし、しばらくしてからやる必要があります。 私はそこに眠ることができますか? すべてのスレッドをブロックしますか? またはremovalListenerは別のスレッドで実行されますか?guavaキャッシュのremovalListenerは別のスレッドで実行されていますか?

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

答えて

3

Removal Listeners · CachesExplained · google/guava Wikiから:

警告:除去リスナーの操作は、デフォルトでは同期的に実行され、キャッシュのメンテナンスは、通常、通常のキャッシュ動作中に実行されているので、高価な除去リスナーは、通常のキャッシュ機能を遅くすることができます!高価なリスナーを使用している場合は、RemovalListeners.asynchronous(RemovalListener, Executor)を使用してRemovalListenerを非同期で動作させるようにしてください。

Executor executor = Executors.newFixedThreadPool(10); 
CacheBuilder.newBuilder() 
     .removalListener(RemovalListeners.asynchronous(notification -> { 
      Uninterruptibles.sleepUninterruptibly(10, TimeUnit.MINUTES); 
      try { 
       //close 
      } catch (final IOException e) { 
      } 
     }, executor)) 
     .build(); 
関連する問題