Ich habe ein kleines Beispiel zum Lesen einer Textdatei erstellt und den Anruf mit CompletableFuture
umbrechen.mit Lieferanten in CompleableFuture ergibt anderes Ergebnis als mit Lambda
public class Async {
public static void main(String[] args) throws Exception {
CompletableFuture<String> result = ReadFileUsingLambda(Paths.get("path/to/file"));
result.whenComplete((ok, ex) -> {
if (ex == null) {
System.out.println(ok);
} else {
ex.printStackTrace();
}
});
}
public static CompletableFuture<String> ReadFileUsingSupplier(Path file) throws Exception {
return CompletableFuture.supplyAsync(new Supplier<String>() {
@Override
public String get() {
try {
return new String(Files.readAllBytes(file));
} catch (IOException e) {
e.printStackTrace();
return "test";
}
}
}, ForkJoinPool.commonPool());
}
public static CompletableFuture<String> ReadFileUsingLambda(Path file) throws Exception {
return CompletableFuture.supplyAsync(() -> {
try {
return new String(Files.readAllBytes(file));
} catch (IOException e) {
e.printStackTrace();
return "test";
}
} , ForkJoinPool.commonPool());
}
}
Dieser Code gibt nichts zurück. Es wird ausgeführt und "nichts passiert", keine Fehler oder Ausgaben. Wenn ich ReadFileUsingSupplier
statt ReadFileUsingLambda
rufe, bekomme ich den Dateiinhalt in der Konsole ausgedruckt!
Das macht für mich keinen Sinn, weil ein Lambda eine Abkürzung für das Schreiben einer Inline-Funktion ist und das Verhalten nicht ändern sollte, aber in diesem Beispiel scheint es.
danke. Dies hat den Trick gemacht, aber vorwärts gehen, wie kann ich sicherstellen, dass mein Programm nicht beendet wird, bis ich das Ergebnis von CompletableFuture –
@SulAga zurückbekommen Sie können einfach 'result.get()' oder 'result.join()' – assylias
aufrufen Also ist das Join oder Get ein blockierender Aufruf? ist es eine Blockierung für den Haupt-Thread oder CompletableFuture-Thread? ist das ein Problem, d. h. blockiert –