2014-09-17 11 views
8

Lange Rede kurzer Sinn: Ich habe eine Sammlung von Future Objekte. Einige von ihnen sind bereits in Arbeit, andere nicht. Ich wiederhole die Sammlung und rufe future.cancel(false) an, die gemäß der Dokumentation alle Future s abbrechen sollte, die gerade nicht laufen, aber alle anderen erlauben sollten, abzuschließen.Java cancel Zukunft - Wie man auf Ende wartet?

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() in der Tat vorher aufgerufen wurde und future.get() immer eine CancellationException wirft, obwohl die Future noch läuft.

Irgendwelche Vorschläge?

Antwort

2

Da Future Modelle für die Zukunft Ergebnis einer anstehenden Berechnung widerspiegeln, und da das Ergebnis von einer abgebrochenen Zukunft nicht erhält, ist es vernünftig, dass Future gibt Ihnen keine Möglichkeit, herauszufinden, wann die Berechnung, deren Ergebnis entsorgt wurde, abgeschlossen ist. 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, ist die Executor-Service-API direkt am nächsten, um den gesamten Executor-Dienst herunterzufahren und auf dessen Beendigung zu warten.

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 ein wenig Ordnung hält, damit Sie überprüfen können, wann sie abgeschlossen ist Laufen.

1

Sie könnten eine Flagge, um Ihre Zukunft Implementierung hinzufügen, die die tatsächlichen‘Zustand

0

gegeben ein Callable<Object> c:

futureTask1 = new FutureTask<Object>(c); 
futureTask2 = new FutureTask<Void>(futureTask1, null); 

executor.execute(futureTask2); 

jetzt, wenn Sie das Ergebnis wollen:

futureTask1.get() 

, wenn Sie nicht mehr im Ergebnis interessiert sind:

futureTask1.cancel(mayInterruptIfRunning) 

wenn Sie möchten, zu warten, um sicher zu sein, dass der Code in der Callable nicht ausgeführt wird (und nicht wird) (ob nie aufgerufen, z. B. fertige Auslöschung oder beendete das Ergebnis produzieren):

futureTask2.get() 

Auch wenn abgebrochen, bevor es anfing zu arbeiten, das für den Testamentsvollstrecker wartet die geplante Aufgabe auszuführen (was nichts zu werden, wenn bereits abgesagt), so dass diese warten können unnecessariliy für andere langwierige Aufgaben, die abgeschlossen werden müssen. YMMV

Verwandte Themen