未来取消方法文档
根据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
。
-
cancel(...)
,isDone()
应始终为true
。cancel(...)
返回并不重要。 - 如果
cancel(...)
返回true
则表示此未来现已取消,isCancelled()==true
- 如果
cancel(...)
返回false
则表示完成不是由于对cancel()
调用 -
cancel(false)
表示cancel
方法不应该尝试取消试图完成未来的任务(“任务”的含义取决于Future
的实现),任务将继续运行但是未来被取消( isDone()==真)。 -
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()); }