2017-03-15 3 views
0

Je souhaite effectuer un nettoyage lorsque l'objet est retiré du cache de goyave. Mais je dois le faire après un certain temps. Puis-je mettre le sommeil là-bas? Va-t-il bloquer tous les threads? Ou removalListener s'exécute dans un thread séparé?Est-ce que removalListener du cache de goyave s'exécute dans un thread séparé?

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

Répondre

3

De Removal Listeners · CachesExplained · google/guava Wiki:

Attention: les opérations d'écoute de suppression sont exécutées de manière synchrone par défaut, et depuis la maintenance du cache est normalement effectué pendant les opérations de cache normales, les auditeurs de suppression coûteux peuvent ralentir la fonction de cache normale ! Si vous avez un écouteur de suppression coûteux, utilisez RemovalListeners.asynchronous(RemovalListener, Executor) pour décorer un RemovalListener pour fonctionner de manière asynchrone.

par exemple.

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