Ich habe eine Reihe von Futures
erstellt durch Übermittlung Callable
s an eine Executor
. Pseudo-Code:Timeout während des Wartens auf die Fertigstellung eines Stapels von Futures?
for all tasks
futures.add(executor.submit(new callable(task)))
Jetzt möchte ich alle Futures warten höchstens n Sekunden bis alles abgeschlossen. Ich weiß, ich kann Future#get(timeout)
anrufen, aber wenn ich das sequenziell für alle meine Zukünfte in einer Schleife rufe, fangen die Zeitpunkte an, sich zu addieren. Pseudo-Code:
for all futures
future.get(timeout)
get
Blöcke mit einem Timeout, bis das Ergebnis ist fertig. Wenn daher der erste Vorgang kurz vor dem Timeout abgeschlossen wird und der zweite auch kurz vor dem Timeout abgeschlossen wird, ist die gesamte Ausführungszeit höchstens number of futures * timeout
statt timeout
.
Daher suche ich nach einer Methode, die eine Liste von Future
s und ein Timeout akzeptiert, läuft alle parallel und gibt dann eine Sammlung von zukünftigen Ergebnissen. Irgendwelche Ideen?
Dies ist nicht ganz klar. Was möchten Sie mit den Tasks machen, die nach Ablauf des Timeouts noch nicht abgeschlossen sind? Möchten Sie, dass sie storniert werden oder fortgeführt werden dürfen? –
Sie sollten abgebrochen werden. Außerdem muss ich irgendwie wissen, welche fertig waren und welche nicht. Ich schätze, dafür könnte ich noch einmal über die Zukunft iterieren und auf allen von ihnen 'isDone' aufrufen. –