Java abbrechen Zukunft - Wie man auf Ende wartet?

8

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?

    
mdzh 17.09.2014, 12:58
quelle

3 Antworten

2

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.

    
Marko Topolnik 17.09.2014, 13:14
quelle
1

Sie können Ihrer Future-Implementierung ein Flag hinzufügen, das den tatsächlichen Status der Zukunft widerspiegelt.

    
Katerina A. 17.09.2014 13:08
quelle
0

bei Callable<Object> c :

%Vor%

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

    
feh 08.01.2016 10:13
quelle

Tags und Links