2015-05-31 14 views
8

Oggi ho sperimentato il "nuovo" CompletableFuture da Java 8 e mi sono trovato confuso quando non ho trovato un metodo runAsync(Callable). Posso farlo da solo come mostrato di seguito, ma perché questo (per me metodo di utilità molto ovvio e utile) manca? Am I mi manca qualcosa?CompletableFuture da 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

Sì; 'CompletableFuture' è purtroppo usato in qualsiasi punto del JDK. http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html – SLaks

+1

@SLaks: sì, l'interfaccia * è orribile. è probabilmente inteso come una buona implementazione che possiamo usare internamente. molto sfortunato che java non abbia una buona interfaccia asincrona ufficiale. – ZhongYu

risposta

3

si suppone di utilizzare supplyAsync(Supplier<U>)

In generale, lambda e eccezioni controllate non funzionano molto bene insieme, e CompletableFuture evita eccezioni controllate in base alla progettazione. Anche se nel tuo caso non dovrebbe essere un problema.

discussioni correlate:

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

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

+2

Questo mi fa sembrare ancora più incoerente. Perché sì, _does_ ti consente di gestire le eccezioni utilizzando ad es. 'WhenComplete'. Ma puoi ottenere le eccezioni "dentro" il processo sfogliando lo stile fluente e usando i tuoi metodi di helper statici che poi chiamano "completeExceptionally". Che è davvero brutto da leggere nel codice. – diesieben07

+3

C'era un * lotto * di discussioni su questo sulla mailing list. Alla fine, non ero convinto da Doug Lea, e trovo il tutto non adatto ai programmatori. Ho finito per creare la mia interfaccia [Async] (http://bayou.io/release/0.9/javadoc/bayou/async/Async.html). – ZhongYu

+1

Sì, l'ho visto. Davvero un buon lavoro sull'API, questo è esattamente quello che mi sarei aspettato da CompletableFuture. – diesieben07

Problemi correlati