Se o seu Future
for o resultado de uma chamada a um ExecutorService
método (por exemplo submit()
), o mais fácil seria usar o CompletableFuture.runAsync(Runnable, Executor)
método.
De
Runnbale myTask = ... ;
Future<?> future = myExecutor.submit(myTask);
para
Runnbale myTask = ... ;
CompletableFuture<?> future = CompletableFuture.runAsync(myTask, myExecutor);
O CompletableFuture
é então criado "nativamente".
EDIT: Seguindo comentários de @SamMefford corrigidos por @MartinAndersson, se você quiser passar um Callable
, você precisa chamar supplyAsync()
, convertendo o Callable<T>
em um Supplier<T>
, por exemplo, com:
CompletableFuture.supplyAsync(() -> {
try { return myCallable.call(); }
catch (Exception ex) { throw new RuntimeException(ex); } // Or return default value
}, myExecutor);
Como T Callable.call() throws Exception;
lança uma exceção e T Supplier.get();
não, você precisa capturar a exceção para que os protótipos sejam compatíveis.