Sie können auch Listen von Futures verwenden:
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;
}
}));
dann, wenn Sie auf alle von ihnen beitreten möchten, seine im Wesentlichen das Äquivalent von Beitritt auf jeder, (mit dem zusätzlichen Vorteil, dass es Ausnahmen von Kind-Threads an die Haupt wieder aufruft):
for(Future f: this.futures) { f.get(); }
Grundsätzlich besteht der Trick darin, .get() für jede Zukunft einzeln aufzurufen, anstatt in einer Endlosschleife isDone() für (alle oder jede) aufzurufen. Auf diese Weise ist gewährleistet, dass Sie durch diesen Block "weitergehen", sobald der letzte Thread beendet ist. Der Nachteil ist, dass der .get()-Aufruf erneut Ausnahmen auslöst. Wenn einer der Threads stirbt, würden Sie aus diesem Block möglicherweise aussteigen, bevor die anderen Threads fertig sind [um dies zu vermeiden, könnten Sie eine catch ExecutionException
um den Anruf zu erhalten]. Die andere Einschränkung ist es behält einen Verweis auf alle Threads, so dass, wenn sie Thread-lokale Variablen haben sie nicht gesammelt werden, bis nachdem Sie über diesen Block (obwohl Sie in der Lage sein könnte, um dies zu umgehen, wenn es ein Problem wurde, durch Entfernen von Futures aus der ArrayList). Wenn Sie wissen wollen, welcher Future "zuerst fertig ist", könnten Sie etwas wie folgt verwenden https://stackoverflow.com/a/31885029/32453