У меня есть ExecutorService
который направляет вычисленных данных в CompletableFuture
:Отмена CompletableFuture контролируется ExecutorService
class DataRetriever {
private final ExecutorService service = ...;
public CompletableFuture<Data> retrieve() {
final CompletableFuture<Data> future = new CompletableFuture<>();
service.execute(() -> {
final Data data = ... fetch data ...
future.complete(data);
});
return future;
}
}
Я хочу клиент/пользователь, чтобы иметь возможность отменить задание:
final DataRetriever retriever = new DataRetriever();
final CompletableFuture<Data> future = retriever().retrieve();
future.cancel(true);
Это не работает, так как это отменяет внешний CompletableFuture
, но не внутреннее будущее, как запланировано в службе исполнителя.
Возможно ли распространять cancel()
на внешнее будущее во внутреннее будущее?
Почему вы используете 'CompletableFuture' в первую очередь? Почему бы просто не выполнить 'Callable ' и вернуть результирующее 'Future' из' retrieve() '? – erickson