Comment utiliser invokeAll() pour permettre à tous de pool de threads font leur travail?
ExecutorService pool=Executors.newFixedThreadPool(7);
List<Future<Hotel>> future=new ArrayList<Future<Hotel>>();
List<Callable<Hotel>> callList = new ArrayList<Callable<Hotel>>();
for(int i=0;i<=diff;i++){
String str="2013-"+(liDates.get(i).get(Calendar.MONTH)+1)+"-"+liDates.get(i).get(Calendar.DATE);
callList.add(new HotelCheapestFare(str));
}
future=pool.invokeAll(callList);
for(int i=0;i<=future.size();i++){
System.out.println("name is:"+future.get(i).get().getName());
}
Maintenant, je veux piscine à invokeAll
toutes les la tâche avant d'arriver à la boucle for, mais quand je lance ce programme pour la boucle sera exécuté avant que invokeAll
et jette cette exception:
java.util.concurrent.ExecutionException: java.lang.NullPointerException at
java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source) at
java.util.concurrent.FutureTask.get(Unknown Source) at
com.mmt.freedom.cheapestfare.TestHotel.main(TestHotel.java:65)
Caused by: java.lang.NullPointerException at
com.mmt.freedom.cheapestfare.HotelCheapestFare.getHotelCheapestFare(HotelCheapestFare.java:166)
at com.mmt.freedom.cheapestfare.HotelCheapestFare.call(HotelCheapestFare.java:219)
at com.mmt.freedom.cheapestfare.HotelCheapestFare.call(HotelCheapestFare.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) atjava.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run
InvokeAll doit attendre que tous les Callables avez terminé. Pourriez-vous s'il vous plaît ajouter l'exception et la trace de la pile?
en interne, certains thread va pour la boucle avant l'achèvement et la jette exception
s'il vous plaît aider moi je dois soumettre ma tâche
Selon votre stack trace:
j'ai une liste à ce point, mais quand je le débogage je reçois ma liste
en interne, certains thread va pour la boucle avant l'achèvement et la jette exception
s'il vous plaît aider moi je dois soumettre ma tâche
Selon votre stack trace:
com.mmt.freedom.cheapestfare.HotelCheapestFare.getHotelCheapestFare(HotelCheapestFare.java:166)
. Erreur devrait être là.j'ai une liste à ce point, mais quand je le débogage je reçois ma liste
OriginalL'auteur Sahil Kohli | 2013-08-13
Vous devez vous connecter pour publier un commentaire.
La façon dont une
ExecutorService
fonctionne, c'est que lorsque vous appelezinvokeAll
il attend pour toutes les tâches à effectuer:Ce que cela signifie, c'est que vos tâches sont tous fait, mais certains peuvent avoir jeté une exception. Cette exception est une partie de la
Future
- appelget
provoque l'exception levée de nouveau enveloppé dans unExecutionException
.De vous stacktrack
Vous pouvez voir que c'est effectivement le cas. L'une de vos tâches a échoué avec un NPE. Le
ExecutorService
attiré l'exception et de vous parler d'elle en jetant unExecutionException
lorsque vous appelezFuture.get
.Maintenant, si vous voulez prendre tâches qu'ils terminent vous avez besoin d'un
ExecutorCompletionService
. Cela agit comme unBlockingQueue
qui vous permettra de sondage pour des tâches comme et quand ils ont fini.Dans cet exemple, j'ai une tâche qui demande
take
sur leExecutorCompletionService
qui obtient leFuture
s qu'ils seront disponibles puis-je soumettre des tâches à l'ExecutorCompletionService
.Cela vous permettra d'obtenir la tâche qui a échoué dès qu'il échoue, plutôt que d'avoir à attendre pour toutes les tâches à pas de réussir ensemble.
La seule complication est qu'il est difficile de dire à l'interrogation de fil que toutes les tâches sont effectuées que tout est maintenant asynchrone. Dans cet exemple, j'ai utilisé la connaissance que de 100 missions seront soumis, de sorte qu'il suffit d'interroger 100 fois. D'une manière plus générale serait de collecter les
Future
s de lasubmit
méthode et une boucle au-dessus d'eux pour voir si tout est terminé.Non, et qui n'a aucun sens. La raison pour laquelle vous utilisez un
Collection
dans leExecutorService
est de sorte que vous pouvez attendre de tous d'entre eux avant la fin de la procédure. Avec le " ExecutorCompletionService` vous sont d'interrogation pour l'achèvement de sorte qu'il ne fait aucune différence si vous de les soumettre tous à la fois ou en boucle.ma tâche prend beaucoup de temps, donc je veux qu'ils s'exécutent simultanément, de sorte qu'ils s'exécutent tous en même temps et je reçois mon avenir suite après la fin de threads
s'il vous plaît répondre @Boris
Dans ce cas, vous pouvez utiliser le
invokeAll
méthode de laExecutorService
et de traiter toutes lesFuture
s que vous êtes en train de faire. La raison d'utiliser unExecutorCompletionListener
est que vous êtes averti dès que chaque tâche est terminée. Ce sont deux choses différentes. Je ne comprends pas ce que vous voulez; vous pouvez processus de chaque résultat, comme il arrive ou processus tout à la fin. Dans les deux cas vous avez besoin pour gérer les éventuellesExecutionException
s.OriginalL'auteur Boris the Spider
L'avenir.get() jette ci-dessous exceptions.
CancellationException
- si le calcul a été annuléExecutionException
- si le calcul a déclenché une exceptionInterruptedException
- si le thread courant a été interrompu pendant l'attenteAttraper toutes ces exceptions lorsque vous appelez
get()
méthode.J'ai simulé division par zéro exception pour certains
Callable
tâches, mais une exception dans unCallable
n'affecte pas les autresCallable
tâches soumis àExecutorService
si vous attraper au-dessus de trois exceptions, comme montré dans l'exemple de code.Exemple d'extrait de code:
de sortie:
OriginalL'auteur Ravindra babu
invokeAll est un blocage de la méthode. Cela signifie – JVM de ne pas passer à la ligne suivante jusqu'à ce que tous les fils sont terminés. Donc, je pense qu'il ya quelque chose de mal avec votre fil futur résultat.
à partir de cette ligne, je pense qu'il y a certains contrats à terme n'avons pas de résultat et peut être nulle, de Sorte que vous devriez vérifier votre code, s'il y a des contrats à Terme null,le Cas échéant, obtenir un si avant cette ligne exécutée.
Future.get
méthode est de lancer unExectuionExcetion
- c'est évident. Le résultat n'est pasnull
. LeCallable
rencontré unNullPointerException
dans lecall
méthode. C'est pris dans laFuture
et ensuite enveloppé dans uneExectionException
.Désolé, j'ai raté le java.util.de façon concomitante.ExecutionException, de Sorte qu'Il est le Futur Code obtenir cette exception.
de sorte que certains autres de meilleure solution
OriginalL'auteur Winston