Java définir un rappel de l'ExecutorService
J'ai un fixedThreadPool que j'utilise pour exécuter un tas de threads de travail à réaliser en parallèle de l'exécution d'une tâche avec de nombreux composants.
Lorsque tous les threads ont fini, j'ai récupérer leurs résultats (qui sont assez grandes) à l'aide d'une méthode (getResult) et les écrire dans un fichier.
En fin de compte, pour économiser de la mémoire et d'être en mesure de voir les résultats intermédiaires, j'aimerais que chaque thread pour écrire son résultat dans le fichier dès qu'il termine l'exécution et ensuite de libérer sa mémoire.
Normalement, je voudrais ajouter du code à cet effet à la fin de la méthode run (). Cependant, certains autres objets de cette classe appelle aussi ces threads, mais NE veulent PAS à la rédaction de leurs résultats dans un fichier au lieu d'utiliser leurs résultats pour effectuer d'autres calculs, qui sont par la suite dans le fichier.
Donc, je me demandais si il est possible d'attacher une fonction de rappel pour le cas d'un fil de finition à l'aide de la ExecutorService. De cette façon, je peux récupérer immédiatement son résultat et de libérer de la mémoire, dans ce scénario, mais de ne pas casser le code, lorsque ces fils sont utilisés dans d'autres scénarios.
Est une chose possible?
OriginalL'auteur Alex | 2012-10-29
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez Google Goyave est une option, vous pouvez utiliser le ListenableFuture interface de la manière suivante:
ExecutorService
à un ListeningExecutorService viaMoreExecutors.listeningDecorator(existingExecutorService)
submit(Callable<V>)
méthode deListeningExecutorService
a été réduite pour retourner unListenableFuture
, qui est un subinterface deFuture
.ListenableFuture
a unaddListener()
méthode de sorte que vous pouvez enregistrer un rappel à exécuter lorsque l'avenir est terminé.OriginalL'auteur Peter
ExecutorService#submit
retourFutureTask<T>
qui vous permet de récupérer le résultat et laExecutorService#get
méthode de bloquer l'exécution jusqu'à ce que le calcul n'est pas terminé. Exemple -run()
méthode comme indiqué dans sa question.La raison pour laquelle vous pourriez soumettre la tache à un thread séparé est de sorte que vous pouvez éviter de bloquer le thread en cours pour un long calcul, et vous pouvez utiliser le thread en cours pour d'autres choses. Depuis
future.get()
blocs, il doit être appelé dans une tâche qui est également soumis à laExecutorService
.OriginalL'auteur Subhrajyoti Majumder
Pas directement, non, mais il ya un couple de méthodes que vous pourriez faire cela. La manière la plus simple qui vient à l'esprit est d'envelopper votre
Runnable
dans un autreRunnable
qui fait la récolte des résultats.Donc, si vous voulez faire quelque chose comme:
myRunnable.getReulst
encore bloque le thread qui s'exécute, il n'est pas de la pure mode asynchrone avec "rappel".J'ai supposé que le
getResult()
appel ne bloquez pas et que lerun()
méthode stockés tous les résultats dans votre objet. Avoir unget...
méthode de bloc n'est pas le meilleur modèle de @JasonMing.OriginalL'auteur Gray
Vous pouvez ajouter un rappel pour quand un thread retourne dans Java 8+ à l'aide de
CompletableFuture
comme dans l'exemple suivant, oùt
est le résultat de votre longue calcul,Si vous souhaitez utiliser les callbacks en seulement Java 7, vous pourriez faire quelque chose comme,
OriginalL'auteur Max
Oups, vient de trouver une réponse sur StackOverflow:
Java ExecutorService de rappel sur le thread de résilier
Merci pour la patience!
OriginalL'auteur Alex