Vous pouvez également utiliser les Listes de Futures :
List<Future> futures = new ArrayList<Future>();
// now add to it:
futures.add(executorInstance.submit(new Callable<Void>() {
public Void call() throws IOException {
// do something
return null;
}
}));
ensuite, lorsque vous voulez faire une jointure sur tous ces threads, c'est essentiellement l'équivalent d'une jointure sur chacun d'entre eux (avec l'avantage supplémentaire que les exceptions des threads enfants sont réactivées dans le thread principal) :
for(Future f: this.futures) { f.get(); }
En fait, l'astuce consiste à appeler .get() sur chaque futur, un par un, au lieu de faire une boucle infinie en appelant isDone() sur (tous ou chacun). Ainsi, vous êtes assuré de "passer" à travers et au-delà de ce bloc dès que le dernier thread se termine. Le problème est que, puisque l'appel .get() relance les exceptions, si l'un des threads meurt, vous relèverez l'exception avant que les autres threads n'aient terminé. catch ExecutionException
autour de l'appel]. L'autre problème est qu'il garde une référence à tous les threads, donc s'ils ont des variables locales de thread, elles ne seront pas collectées avant que vous ayez passé ce bloc (bien que vous puissiez contourner cela, si cela devenait un problème, en retirant les Future de la ArrayList). Si vous voulez savoir quel Future "finit en premier", vous pouvez utiliser quelque chose comme https://stackoverflow.com/a/31885029/32453