Jeśli twoja Future
jest wynikiem wywołania ExecutorService
metody (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 CompletableFuture
jest 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.