gpt4 book ai didi

java - future 的取消方法文档

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:19:56 25 4
gpt4 key购买 nike

根据 http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html如果调用了 cancel(boolean mayInterruptIfRunning)isDone 返回 true

After this method returns, subsequent calls to isDone() will always return true.

但是,任务可能正在运行并且 mayInterruptIfRunning 设置为 false。那么,在那个调用之后应该立即返回什么 isDone() 呢? true 因为取消(这是错误的)?

此外,cancel(boolean) 方法是否返回 false 也不清楚。

P. S. 我正在实现一些简单的线程池,所以我继承自 Future

最佳答案

  1. cancel(...) 之后,isDone() 应始终为 truecancel(...) 返回什么并不重要。
  2. 如果 cancel(...) 返回 true 这意味着这个 future 现在被取消并且 isCancelled()==true
  3. 如果 cancel(...) 返回 false 这意味着完成不是由于调用 cancel()<
  4. cancel(false) 表示 cancel 方法不应尝试取消正在尝试完成 future 的任务(“任务”的含义取决于Future 的实现),任务将继续运行但 future 被取消(isDone()==true)。
  5. cancel(true) 表示应该尝试取消正在运行的任务,无论尝试成功与否, future 都会被取消 (isDone()==true)。

请记住,这是一个契约(Contract),它必须由 Future 的实现来执行。

编辑 isDone()cancel()

之后始终为真

下面是对某些场景进行试验的测试:

@Test
public void test() throws ExecutionException, InterruptedException {
ExecutorService threadExecutor = Executors.newFixedThreadPool(1);
CompletableFuture c1 = new CompletableFuture();
CompletableFuture c2 = new CompletableFuture();
Future<String> future = threadExecutor.submit(() -> {
try {
c1.complete(null);
Thread.sleep(10000);
c2.complete("normal");
} catch (InterruptedException e) {
c2.complete("interrupted");
}
return "aaa";
});
c1.join(); // waits for the task start
// future.get(); // awaits the completion
System.out.println("cancel: " + future.cancel(true));
//System.out.println("cancel: " + future.cancel(false));
System.out.println("isDone: " + future.isDone());
System.out.println("isCanceled: " + future.isCancelled());
System.out.println("task: " + c2.join());
}

关于java - future 的取消方法文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30140463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com