Si votre Future
est le résultat d'un appel à une ExecutorService
méthode (par exemple submit()
), le plus simple serait d'utiliser leCompletableFuture.runAsync(Runnable, Executor)
méthode à la place.
De
Runnbale myTask = ... ;
Future<?> future = myExecutor.submit(myTask);
à
Runnbale myTask = ... ;
CompletableFuture<?> future = CompletableFuture.runAsync(myTask, myExecutor);
le CompletableFuture
est alors créé "nativement".
EDIT: Poursuite des commentaires de @SamMefford corrigés par @MartinAndersson, si vous voulez passer a Callable
, vous devez appeler supplyAsync()
, en convertissant le Callable<T>
en a Supplier<T>
, par exemple avec:
CompletableFuture.supplyAsync(() -> {
try { return myCallable.call(); }
catch (Exception ex) { throw new RuntimeException(ex); } // Or return default value
}, myExecutor);
Parce que T Callable.call() throws Exception;
lève une exception et T Supplier.get();
ne le fait pas, vous devez intercepter l'exception pour que les prototypes soient compatibles.