未来的取消方法文档

Future cancel method documentation

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

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

但是,有可能任务是运行并且mayInterruptIfRunning设置为false。那么,在那个电话之后 return isDone() 应该做什么? true 因为取消(这是错误的)?

另外,不清楚cancel(boolean)方法returns false.

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

  1. cancel(...) 之后,isDone() 应该总是 truecancel(...) 返回什么并不重要。
  2. 如果cancel(...) returns true 这意味着这个未来现在已经取消并且 isCancelled()==true
  3. If cancel(...) returns false 这意味着完成不是由于对 cancel()
  4. 的调用
  5. cancel(false) 表示 cancel 方法不应尝试取消正在尝试完成未来的任务("task" 的含义取决于 Future的实现),任务将保持 运行 但未来被取消(isDone()==true)。
  6. cancel(true) 意味着应该尝试取消 运行 任务,无论尝试成功与否,将来都会被取消 (isDone()==true)。

请记住,这是一个合同,它必须由 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());
}