未来的取消方法文档

时间:2015-05-09 13:24:49

标签: java concurrency future java.util.concurrent

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

  

此方法返回后,对isDone()的后续调用将始终返回true。

但是,任务可能正在运行且mayInterruptIfRunning设置为false。那么,在那次通话之后应该返回isDone()什么? true因为取消(这是错误的)?

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

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

1 个答案:

答案 0 :(得分:2)

  1. cancel(...)之后,isDone()应始终为truecancel(...)返回的内容无关紧要。
  2. 如果cancel(...)返回true,则表示此未来现已取消且isCancelled()==true
  3. 如果cancel(...)返回false,则表示完成不是由于此cancel()的调用
  4. cancel(false)表示cancel方法不应尝试取消尝试完成未来的任务(“任务”的含义取决于Future的实现) ,任务将继续运行但未来被取消(isDone()== true)。
  5. cancel(true)表示应尝试取消正在运行的任务,无论尝试是否成功,将来会被取消(isDone()== true)。
  6. 请记住,这是一份合同,必须由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());
    }
    
相关问题