2016-07-20 1 views
-2

Voici la méthode que je me réfère à, et je me demandais si je l'appelle présenter, sans utiliser la méthode get Future pour récupérer le résultat, s'il y aura une fuite de fil (je veux dire un fil dans la piscine de fil ne pourra jamais être réutilisé puisque son résultat n'est pas récupéré), ce qui aura un impact sur les performances de tout le pool de threads dans le futur? Merci.soumettre de ExecutorService confusion en Java

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#submit-java.util.concurrent.Callable-

salutations Lin

+1

_Je signifie un fil dans la piscine de fil ne pouvoir être réutilisé à nouveau depuis son résultat n'est pas retrieved_ Pouvez-vous décrire le comportement que vous pensez d'ici? –

+1

C'est quelque chose que vous pourriez facilement tester: Créer un pool de threads fixe, soumettre plus de requêtes que le nombre de threads, et voir ce qu'il se passe. –

+0

@SotiriosDelimanolis, merci pour la réponse et voter. Je suppose que si le pool de threads est de taille 5, si je soumets 5 threads, sans récupérer le résultat, si je peux soumettre le 6ème thread? Ceci est la question. –

Répondre

2

Une chose que vous devez savoir est que ExecutorService est une interface, pas une classe, donc la réponse pourrait être différentes pour différentes implémentations de ExecutorService. Cela étant dit, il ne serait pas logique pour la plupart des applications si un ExecutorService se comportait de la manière dont vous vous inquiétez. Il serait beaucoup plus logique si chaque thread de travail stockerait son résultat dans l'objet Future qui a été renvoyé au client, puis oublier le résultat, et oublier le Future, et passer à la tâche suivante.

IF qui est sa mise en œuvre, et si votre code aussi oublié le Future, le Future et le résultat à la fois seraient recueillis par le GC, et ce serait la fin de celui-ci.

C'est la mise en œuvre qui aurait du sens pour moi. Vous pouvez voir par vous-même comment la classe ThreadPoolExecutor dans le projet OpenJDK ne fait en examinant le code source:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/concurrent

Je pris un coup d'oeil rapide, mais je n'ai pas le temps de l'étudier en profondeur .

Comme je l'ai dit dans mon commentaire (ci-dessus), je voudrais écrire un test, et trouver pour moi-même si j'avais aucun doute.

+0

Merci James, votez pour la réponse. Vous vous demandez si l'impact de la performance de la mémoire? c'est-à-dire que si je ne récupère pas le résultat, la mémoire sera plus grande et plus grande et peut déclencher le GC, correct? –

+1

@LinMa, Ignorer un résultat qui a déjà été renvoyé par votre tâche n'augmentera pas l'utilisation de la mémoire. La mémoire a été allouée lorsque votre tâche a créé l'objet, et elle sera récupérée par le GC peu après que l'objet devienne "inaccessible". (c'est-à-dire, quand il n'y a pas de variables dans le programme qui s'y réfèrent.) –

+0

Merci James, votez et marquez votre réponse comme réponse. Appréciez pour la patience de m'expliquer. –