Lange Rede, kurzer Sinn: Ich habe eine Sammlung von Future
-Objekten. Einige von ihnen sind bereits in Arbeit, andere nicht. Ich wiederhole die Sammlung und rufe future.cancel(false)
auf, was laut der Dokumentation alle Future
s abbrechen sollte, die gerade nicht laufen, aber alle anderen erlauben sollten.
Meine Frage ist: Woher weiß ich, wann eine bestimmte Future
abgeschlossen ist, nachdem ich future.cancel(false)
aufgerufen habe? future.isDone()
gibt immer true
zurück, weil cancel()
tatsächlich zuvor aufgerufen wurde und future.get()
immer eine CancellationException
, obwohl Future
noch läuft.
Irgendwelche Vorschläge?
Da Future
das zukünftige Ergebnis einer ausstehenden Berechnung modelliert, und da dieses Ergebnis nicht aus einer stornierten Zukunft stammt, ist es sinnvoll, dass Future
keine Möglichkeit gibt, herauszufinden, wann die Berechnung durchgeführt wurde, deren Ergebnis entfernt wurde von wird vervollständigen. Mit anderen Worten, Sie brauchen ein anderes Paradigma, um Ihr Ziel mit diesem Ansatz zu erreichen.
Wenn Sie warten möchten, dass alle eingereichten Aufgaben abgeschlossen sind, wird die Executor Service-API direkt vom gesamten Executor-Dienst heruntergefahren und auf dessen Beendigung gewartet.
Wenn das Obige nicht zu Ihrer Lösung passt, sehe ich keinen besseren Ansatz als eine benutzerdefinierte Lösung, z. B. eine benutzerdefinierte Implementierung von Runnable
, die auf der Seite etwas Ordnung hält, sodass Sie überprüfen können, wann dies der Fall ist fertig ausgeführt.
Sie können Ihrer Future-Implementierung ein Flag hinzufügen, das den tatsächlichen Status der Zukunft widerspiegelt.
bei Callable<Object> c
:
jetzt, wenn Sie das Ergebnis wollen:
%Vor%wenn Sie nicht mehr an dem Ergebnis interessiert sind:
%Vor%Wenn Sie warten wollen, um sicher zu sein, dass der Code in der Callable nicht ausgeführt wird (und nicht wird) (ob nie aufgerufen, beendet oder das Ergebnis beendet wurde):
%Vor%Selbst wenn abgebrochen wird, bevor es zu arbeiten anfängt, wartet dies darauf, dass der Executor die geplante Aufgabe ausführt (was zu nichts führt, wenn er bereits abgebrochen wurde), so dass andere lange andauernde Aufgaben möglicherweise unnötig lange warten müssen. YMMV
Tags und Links java future futuretask