Wie zu unterbrechen zugrunde liegenden Ausführung von CompletableFuture
Ich weiß, dass CompletableFuture
design hat keine Kontrolle über seine Ausführung mit Unterbrechungen, aber ich nehme an, einige von Euch haben dieses problem. CompletableFuture
s sind sehr gute Art und Weise zu Komponieren asynchrone Ausführung, aber gegeben der Fall, wenn Sie möchten, dass die zugrunde liegenden Ausführung unterbrochen oder gestoppt, wenn die Zukunft wird abgesagt, wie machen wir das? Oder müssen wir einfach akzeptieren, dass alle abgebrochen oder manuell abgeschlossen CompletableFuture
wird keine Auswirkungen auf die thread-Entwicklung zu vervollständigen?
Dass ist, meiner Meinung nach, offensichtlich eine nutzlose Arbeit, die Zeit braucht, der Testamentsvollstrecker Arbeiter. Ich Frage mich, welches Konzept oder design könnte in diesem Fall helfen?
UPDATE
Hier ist ein einfacher test für diese
public class SimpleTest {
@Test
public void testCompletableFuture() throws Exception {
CompletableFuture<Void> cf = CompletableFuture.runAsync(()->longOperation());
bearSleep(1);
//cf.cancel(true);
cf.complete(null);
System.out.println("it should die now already");
bearSleep(7);
}
public static void longOperation(){
System.out.println("started");
bearSleep(5);
System.out.println("completed");
}
private static void bearSleep(long seconds){
try {
TimeUnit.SECONDS.sleep(seconds);
} catch (InterruptedException e) {
System.out.println("OMG!!! Interrupt!!!");
}
}
}
- Ich Frage mich, ob wir etwas umsetzen, wie seine statische Methode supplyAsync aber mit zusätzlicher Logik, die prüft, ob seine fertig oder abgesagt wird interrupt der thread ausgeführt wurde, für diese Aufgabe...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
CompletableFuture
ist nicht im Zusammenhang mit der asynchronen Aktion, die möglicherweise vervollständigen.Kann es auch nicht werden einem separaten thread arbeiten abgeschlossen haben (es kann sogar sein, dass viele threads arbeiten daran). Auch wenn es heißt, es gibt keinen link von einer
CompletableFuture
zu jedem thread, der hat eine Referenz darauf.Als solche, es gibt nichts, was Sie tun können, durch
CompletableFuture
zu unterbrechen, alle Threads, die ausgeführt werden können, manche Aufgabe, die werden es vollenden. Sie müssen schreiben Sie Ihre eigene Logik, welche Spuren jedeThread
Instanzen, die erfassen einer Referenz auf dieCompletableFuture
mit der Absicht, es zu vollenden.Hier ist ein Beispiel für die Art der Ausführung, die ich denke, Sie bekommen konnte Weg mit.
Dies setzt Voraus, dass die Aufgabe ausgeführt wird, ist setup zu handhaben Unterbrechungen korrekt.
Thread
s, erhalten Sie Zugang zu denCompletableFuture
sind diejenigen, die durch Ihre benutzerdefinierte factory-Methode. Das ist nicht sehr praktikabel, imo. Die wichtige Sache hier ist, dass die CF ist nicht im Zusammenhang mit einerThread
. Wenn Sie stornieren müssen einige thread ' s funktioniert, sollten Sie vorgelegt haben, die die Arbeit durch eineExecutorService
abgerufen werden dieFuture
und abgebrochen dass. DieRunnable
oderCallable
eingereicht haben, können Sie einen Verweis auf die VGL. Sie werden nicht zur Aufhebung der CF, werden Sie das Abbrechen der Aufgabe durch dieFuture
.Future
undCompletableFuture
und Kündigung von beiden. Beachten Sie, dass dies nicht atomar.runAsync
und Abbrechen möchten, die Aufgabe? Das ist jedoch nicht der einzige use-case fürCompletableFuture
. Sie starten die 10 threads die alle Arbeit in Richtung Abschluss. Unterbrechen diesen threads ist bis zu Ihnen. Die Fäden selbst können nicht wissen, Sie haben einen Verweis auf eine CF und die CF definitiv nicht wissen können. Nur der Entwickler kann.Future
undCompletableFuture
wird nicht sehr sein nützlich, wenn Sie planen, JDK-Bibliotheken zur Abgabe der Arbeit (ExecutorService
s und so).Future
, aber ich glaube nicht, dass Sie ' ll haben Zugriff auf eine Menge der Komponenten, die mit der Fertigstellung (eine Menge ist esprivate
) und ich bezweifle, dass Sie werde in der Lage sein durchführen die Stornierung atomar.CompletableFuture
.CompletableFuture
. Der Verein, den du machst zwischen deinen threads und einerCompletableFuture
ganz alleine.CompletableFuture
war nicht so vorgesehen. Die nächsten wirst du mit einemFuture
und einCompletableFuture
ist, was ich oben dargestellt. Abbrechen derFuture
. Wenn es erfolgreich war, kündigen die damit verbundenenCompletableFuture
. Offensichtlich, Sie könnten in der Lage sein, um das gewünschte Verhalten durch das schreiben Ihrer eigenenCompletableFuture
, aber das ist keine leichte Aufgabe.Thread.sleep()
welche bereits überprüft, die für die Unterbrechung, also mitThread.sleep()
vielleicht nicht die bessere Möglichkeit zu erklären, Ihren Standpunkt (auch wenn die Erklärung richtig ist). Zum Beispiel, Kommentarif (Thread.interrupted()) {..}
und das Programm wird unterbrochen, genau das gleiche. Ich denke, stattThread.sleep()
den code Lesen solltedoIninterrumpibleComputation()
.Was ist das?
Einfachen Test:
Ich weiß nicht, wie die Idee, dass Sie einen Testamentsvollstrecker service, jedes mal, aber vielleicht können Sie einen Weg finden, um die Wiederverwendung der ForkJoinPool.
Bitte Lesen Sie meine Antwort auf die Frage:
Transformation von Java-Zukunft in einem CompletableFuture
In den code dort bereits erwähnt, die CompletionStage Verhalten Hinzugefügt wird RunnableFuture Unterklasse (von ExecutorService-Implementierungen), so können Sie unterbrechen, es in der richtigen Weise.
Was?
Wenn Sie
statt
Der thread wartet auf die Beendigung unterbrochen werden kann. Dieser Biss mich in den a**, also ich bin gerade dabei es gibt. Sie würden dann weitergeben müssen, diese Unterbrechung weiter verwenden /vgl.Abbrechen (...), um wirklich zu beenden der Ausführung.