2015-05-31 16 views
8

Dzisiaj eksperymentowałem z "nowym" CompletableFuture z Java 8 i byłem zdezorientowany, gdy nie znalazłem metody runAsync(Callable). Mogę to zrobić samodzielnie, jak pokazano poniżej, ale dlaczego brakuje mi tej (dla mnie bardzo oczywistej i przydatnej metody użytkowej)? Am I czegoś brakuje?CompletableFuture from 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

Tak; 'CompletableFuture' jest niestety _never_ używane w dowolnym miejscu w JDK. http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html – SLaks

+1

@SLaks - tak, * interfejs * jest ohydny. prawdopodobnie jest to dobra implementacja, którą możemy wykorzystać wewnętrznie. bardzo niefortunne, że java nie ma dobrego oficjalnego interfejsu asynchronicznego. – ZhongYu

Odpowiedz

3

Powinieneś używać supplyAsync(Supplier<U>)

Ogólnie lambdas i sprawdzone wyjątki nie działają bardzo dobrze razem, a CompletableFuture unika sprawdzane wyjątki od projektu. Chociaż w twoim przypadku nie powinno być problemu.

Podobne wątki:

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

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

+2

To sprawia, że ​​wydaje mi się to jeszcze bardziej niespójne. Ponieważ tak, to _ pozwala na obsługę wyjątków za pomocą np. 'whenComplete'. Ale wyjątki można "wsynąć" w proces, wyłamując się z płynnego stylu i używając własnych statycznych metod pomocniczych, które następnie nazywają "completeExceptionally". Co jest naprawdę brzydkiego do czytania w kodzie. – diesieben07

+3

Na liście adresowej było * dużo * dyskusji na ten temat. Ostatecznie Doug Lea nie przekonał mnie i uważam, że cała sprawa nie jest przyjazna programistom. Skończyło się na stworzeniu własnego interfejsu [Async] (http://bayou.io/release/0.9/javadoc/bayou/async/Async.html). – ZhongYu

+1

Tak, widziałem to. Naprawdę dobra robota w API, to jest dokładnie to, czego oczekiwałbym od CompletableFuture. – diesieben07