未来取消方法文档

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

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

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

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

PS我正在实现一些简单的线程池,所以我inheritance了Future

  1. cancel(...)isDone()应始终为truecancel(...)返回并不重要。
  2. 如果cancel(...)返回true则表示此未来现已取消, isCancelled()==true
  3. 如果cancel(...)返回false则表示完成不是由于对cancel()调用
  4. cancel(false)表示cancel方法不应该尝试取消试图完成未来的任务(“任务”的含义取决于Future的实现),任务将继续运行但是未来被取消( isDone()==真)。
  5. cancel(true)表示应该尝试取消正在运行的任务,无论尝试是否成功,将来都会被取消(isDone()== true)。

请记住,这是一份合同,必须由Future的实施来强制执行。

编辑: cancel()后, isDone()始终为true

这是测试一些场景的测试:

 @Test public void test() throws ExecutionException, InterruptedException { ExecutorService threadExecutor = Executors.newFixedThreadPool(1); CompletableFuture c1 = new CompletableFuture(); CompletableFuture c2 = new CompletableFuture(); Future 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()); }