根据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
。
答案 0 :(得分:2)
cancel(...)
之后,isDone()
应始终为true
。 cancel(...)
返回的内容无关紧要。cancel(...)
返回true
,则表示此未来现已取消且isCancelled()==true
cancel(...)
返回false
,则表示完成不是由于此cancel()
的调用cancel(false)
表示cancel
方法不应尝试取消尝试完成未来的任务(“任务”的含义取决于Future
的实现) ,任务将继续运行但未来被取消(isDone()== true)。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());
}