2015-05-31 6 views
8

Heute experimentierte ich mit dem "neuen" CompletableFuture aus Java 8 und fand mich verwirrt, als ich keine runAsync(Callable) Methode fand. Ich kann es selbst tun, wie unten gezeigt, aber warum fehlt diese (für mich sehr offensichtliche und nützliche Hilfsmethode)? Am I fehlt etwas?CompletableFuture von Callable?

public static <T> CompletableFuture<T> asFuture(Callable<? extends T> callable, Executor executor) { 
    CompletableFuture<T> future = new CompletableFuture<>(); 
    executor.execute(() -> { 
     try { 
      future.complete(callable.call()); 
     } catch (Throwable t) { 
      future.completeExceptionally(t); 
     } 
    }); 
    return future; 
}
+0

Ja; 'CompleableFuture' wird leider nie im JDK verwendet. http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html – SLaks

+1

@SLaks - ja, die * Schnittstelle * ist scheußlich. Es ist wahrscheinlich eine gute Implementierung, die wir intern nutzen können. sehr bedauerlich, dass Java keine gute offizielle asynchrone Schnittstelle hat. – ZhongYu

Antwort

3

Du supplyAsync(Supplier<U>)

Im Allgemeinen lambda verwenden soll und geprüfte Ausnahmen nicht sehr gut zusammenarbeiten, und CompletableFuture vermeiden Ausnahmen von Design geprüft. In Ihrem Fall sollte das kein Problem sein.

verwandte Themen:

http://cs.oswego.edu/pipermail/concurrency-interest/2012-December/010486.html

http://cs.oswego.edu/pipermail/concurrency-interest/2014-August/012911.html

+2

Das macht es nur noch widersprüchlicher für mich. Denn ja, es erlaubt Ihnen, Ausnahmen unter Verwendung von z.B. 'whenComplete'. Aber Sie können die Ausnahmen nur dann in den Prozess "bekommen", wenn Sie aus dem fließenden Stil ausbrechen und Ihre eigenen statischen Hilfsmethoden verwenden, die dann 'completeExceptional' aufrufen. Was wirklich hässlich ist, Code zu lesen. – diesieben07

+3

Es gab eine Menge Diskussionen darüber auf der Mailing-Liste. Am Ende war ich nicht von Doug Lea überzeugt, und ich finde die ganze Sache nicht programmiererfreundlich. Ich habe meine eigene [Async] (http://bayou.io/release/0.9/javadoc/bayou/async/Async.html) Schnittstelle erstellt. – ZhongYu

+1

Ja, das habe ich gesehen. Wirklich gute Arbeit auf der API dort, das ist genau das, was ich CompletableFuture erwartet hätte. – diesieben07

Verwandte Themen