Jeśli twoja Futurejest wynikiem wywołania ExecutorServicemetody (np. submit()), Najłatwiej byłoby użyć rozszerzeniaCompletableFuture.runAsync(Runnable, Executor) zamiast niej metody.
Z
Runnbale myTask = ... ;
Future<?> future = myExecutor.submit(myTask);
do
Runnbale myTask = ... ;
CompletableFuture<?> future = CompletableFuture.runAsync(myTask, myExecutor);
Następnie CompletableFuturejest tworzony „natywnie”.
EDYCJA: Kontynuując komentarze @SamMefford poprawione przez @MartinAndersson, jeśli chcesz zdać a Callable, musisz zadzwonić supplyAsync(), zamieniając Callable<T>na a Supplier<T>, np. Za pomocą:
CompletableFuture.supplyAsync(() -> {
try { return myCallable.call(); }
catch (Exception ex) { throw new RuntimeException(ex); }
}, myExecutor);
Ponieważ T Callable.call() throws Exception;zgłasza wyjątek, a T Supplier.get();nie, musisz go złapać, aby prototypy były kompatybilne.