Quel est le moyen recommandé d'attendre jusqu'à la Complétées avenir fils de finition
Je suis en utilisant CompletableFuture
comme indiqué ci-dessous dans le code. Mais en ce qui concerne la façon dont je devrais attendre jusqu'à ce que tous runnables terminer, j'ai trouvé deux façons et je ne sais pas la différence entre eux et celui qui est le meilleur de la pratique? Ils sont comme suit:
Code:
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedSERun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedNWRun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedNERun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedSWRun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
Première approche attendre jusqu'à ce que tous les runnables finition:
this.growSeedExecutor.shutdown();
this.growSeedExecutor.awaitTermination(1, TimeUnit.DAYS);
Deuxième approche attendre jusqu'à ce que tous les runnables finition:
CompletableFuture.allOf(this.growSeedFutureList).join();
S'il vous plaît laissez-moi savoir ce qui est recommandé.
Les deux fonctionnerait donc, cela dépend de ce que vous voulez faire avec l'exécuteur: si vous n'avez pas besoin de plus l'utilisation de l'ancienne - si vous voulez le réutiliser utiliser le dernier... Également dans votre premier extrait de code que vous gardez une référence à la dernière CompletableFuture...
OriginalL'auteur user2121 | 2015-06-08
Vous devez vous connecter pour publier un commentaire.
Deux méthodes sont équivalentes uniquement lorsque l'exécuteur testamentaire (growSeedExecutor) est utilisé uniquement pour la tâche donnée. La première façon de le faire peut conduire à la suivante: un Autre tâches ont besoin de parallélisation, et nouvel exécuteur testamentaire est créé pour chaque tâche. Certains développeur voit beaucoup trop les exécuteurs testamentaires créées, et de décider de l'utilisation commune unique exécuteur testamentaire, mais a échoué à supprimer tous exécuteur des arrêts...
De sorte que le second moyen (join()) est plus fiable, car il est moins complexe. Mais chaque nouvel avenir doit être ajouté à la growSeedFutureList, pas affecté.
OriginalL'auteur Alexei Kaigorodov
Si vous voulez vraiment attendre sur tous les contrats à terme, vous pouvez simplement appeler
join()
sur chacun d'eux:La principale différence par rapport à l'utilisation
allOf()
est que cela va lever une exception dès qu'il atteint un avenir rempli avec une exception, alors que laallOf().join()
version que jeter une exception après tous les contrats à terme ont terminé (exceptionnellement ou pas).Une autre petite différence est que cela ne crée pas l'intermédiaire
allOf
scène. Cette étape reste utile si vous voulez faire quelque chose de manière asynchrone après tous les contrats à terme ont terminé, au lieu de simplement attendre pour tous.La solution avec l'exécuteur testamentaire de l'autre côté a plusieurs inconvénients:
CompletableFuture
s qui sont gérés d'une autre manière;awaitTermination()
si l'une des tâches échoué.OriginalL'auteur Didier L