2017-02-19 1 views
-1

Was passiert, wenn eine CompleableFuture nie abgeschlossen wurde? Kostet es ein Speicherleck? Oder hat es einen Thread aus dem Thread-Pool verschlungen?Was passiert, wenn eine CompleableFuture nie abgeschlossen wurde?

Wenn es passiert, was können wir tun, um diese unvollständigen Futures zu reinigen?

Um zu verdeutlichen, lassen Sie mich sagen, ich habe eine Funktion wie folgt, würde dies irgendwelche Lecks verursachen oder einen Thread innerhalb des Pools verbrauchen, während die Aufgabe ausgeführt wird?

public void foo() 
{ 
    CompletableFuture.supplyAsync(this::functionNeverComplete, pool) 
     .whenComplete((r,e) -> logger.info("done {}",r,e)); 
} 
+1

Warum ist es nicht abgeschlossen? – shmosel

+0

Ich verstehe deine Verwirrung nicht. Eine 'CompleableFuture' steht in keinem Zusammenhang mit Threads. Es verhält sich wie jedes andere Objekt. Es wird GC'ed, wenn es als unerreichbar angesehen wird. –

+0

Was sagt das Javadoc von 'supplyAsync'? –

Antwort

0

Nun, was denkst du? Wenn ein Thread eine Endlosschleife ausführt, haben Sie einen Thread, der für nichts anderes verwendet wird. Sofern Sie die Verarbeitung nicht explizit cancel() vornehmen, wird nichts automatisch gestoppt.

Die Frage ist also: Warum würden Sie eine unendlich lange Aufgabe als CompletableFuture ausführen?

0

Die absolut lange Aufgabe brachte eine Laufzeit hervor, um einen Befehl auszuführen und die resultierende Ausgabe zu erfassen. Es stellt sich heraus, dass das festgefahrene Verhalten dem erzeugten Prozess zugeschrieben wird, der versucht, auf die Sperre zu warten, die verwaist war (der Prozess, der sie besitzt, starb).

Nachdem das Schloss gereinigt wurde, beginnt der Code zu arbeiten. Ich denke, im Nachhinein sollte die Antwort offensichtlich sein, wie @Kayaman vorgeschlagen hat.

Verwandte Themen