A
CompletableFuture与可能最终完成的异步 *** 作无关。
由于(与
FutureTask此类不同)此类无法直接控制导致其完成的计算,因此取消被视为异常完成的另一种形式。方法cancel的作用与相同completeExceptionally(newCancellationException())。
有可能甚至 是 一个单独的线程上完成它的工作(甚至有可能是 许多
线程在它的工作)。即使存在,也没有从
CompletableFuture到任何引用它的线程之间的链接。
因此,您无法执行
CompletableFuture任何 *** 作来中断可能正在运行某些任务的线程来完成该任务。您必须编写自己的逻辑,该逻辑跟踪所有
Thread获取到的引用的实例
CompletableFuture以完成该实例。
这是我认为您可以摆脱的执行类型的示例。
public static void main(String[] args) throws Exception { ExecutorService service = Executors.newFixedThreadPool(1); CompletableFuture<String> completable = new CompletableFuture<>(); Future<?> future = service.submit(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { if (Thread.interrupted()) { return; // remains uncompleted } try { Thread.sleep(1000); } catch (InterruptedException e) { return; // remains uncompleted } } completable.complete("done"); } }); Thread.sleep(2000); // not atomic across the two boolean cancelled = future.cancel(true); if (cancelled) completable.cancel(true); // may not have been cancelled if execution has already completed if (completable.isCancelled()) { System.out.println("cancelled"); } else if (completable.isCompletedExceptionally()) { System.out.println("exception"); } else { System.out.println("success"); } service.shutdown();}
这假定已将正在执行的任务设置为正确处理中断。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)