1

J'ai une piscine de fil de 8 et je le donne environ 100 cas de classe implémentant Callable-à-dire WorkerThreadQuand exactement callable passé à un ExecutorService disponible pour la collecte des ordures

for (List<String> s : listOfLists) { 
    Future<?> future = executor.submit(new Worker(hugeList)); 
} 

for (Future<?> f : futures) { 
     try { 
      String result = (String) f.get(); 
     } catch (InterruptedException e) { 
      logger.error("Interrupted", e); 
     } catch (ExecutionException e) { 
      logger.error("Execution exception", e); 
     } 
    } 


      executor.shutdown(); 

Quand les instances est passé à l'exécuteur peut-il être admissible à la collecte des ordures? Dès que le fichier f.get() est exécuté, ils sont éligibles pour la récupération de place ou tous les new Worker(hugeList) restent en mémoire jusqu'à ce que le executor.shutdown() soit appelé.

Chaque new Worker() est vraiment grand et je voudrais qu'ils soient ramassés après leur thread respectif est exécuté. Mais je ne suis pas sûr quand ils sont éligibles pour cela.

Répondre

1

À moins que le résultat de l'appelable référence le callable lui-même, dès que la tâche est exécutée, il n'est référencé par rien, et devient ainsi admissible à GC.

Un pool est une file d'attente dans laquelle les tâches attendent d'être exécutées et un ensemble de threads les retire de la file d'attente et les exécute. Une fois exécuté, le pool ne se soucie plus des tâches et ne les garde plus nulle part.

+0

Cela a beaucoup de sens. Merci beaucoup. –