【发布时间】:2016-04-19 19:34:24
【问题描述】:
我有一个ExecutorService,它将计算的数据转发到CompletableFuture:
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<Data>并从retrieve()返回结果Future?
标签: java concurrency java.util.concurrent