未来的取消方法文档
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
.
- 在
cancel(...)
之后,isDone()
应该总是 true
。 cancel(...)
返回什么并不重要。
- 如果
cancel(...)
returns true
这意味着这个未来现在已经取消并且 isCancelled()==true
- If
cancel(...)
returns false
这意味着完成不是由于对 cancel()
的调用
cancel(false)
表示 cancel
方法不应尝试取消正在尝试完成未来的任务("task" 的含义取决于 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());
}
根据 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
.
- 在
cancel(...)
之后,isDone()
应该总是true
。cancel(...)
返回什么并不重要。 - 如果
cancel(...)
returnstrue
这意味着这个未来现在已经取消并且isCancelled()==true
- If
cancel(...)
returnsfalse
这意味着完成不是由于对cancel()
的调用
cancel(false)
表示cancel
方法不应尝试取消正在尝试完成未来的任务("task" 的含义取决于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());
}