根据http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.htmlisDone
返回true
,如果取消(boolean mayInter的运行)
被调用。
此方法返回后,对isDone()的后续调用将始终返回true。
但是,有可能任务正在运行并且mayInterrupIfRruning
设置为false
。那么,在调用之后应该返回什么?isDone()
因为取消(这是错误的)而返回true
?
此外,尚不清楚取消(boolean)
方法是否返回false
。
P、 我正在实现一些简单的线程池,所以我继承了Future。
isDone()
应始终为true。无论什么取消(…)
返回true
这意味着此未来现在被取消,并且isCancelled()==true
取消(true)
意味着应该尝试取消正在运行的任务,无论尝试是否成功,未来都将被取消(isDone()==true)请记住,这是一份合同,必须由未来的实施来执行。
编辑:isDone()
在取消()
之后始终为真
下面是一个测试,用于测试一些场景:
@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());
}
假设我使用 ScheduledThreadPoolExecutor 计划了一个任务,并找回了一个 Future。 我后来决定要取消该 Future,并依靠取消的返回值来触发一些清理操作。如果任务已经在运行,我不希望它被中断(所以我将false作为参数传递)。 取消的返回可靠吗?也就是说,如果取消返回“true”,任务是否可能实际上正在运行? 查看OpenJDK 8中的代码,看起来可能存在竞争条件,
问题内容: 我将我的期货从ExecutorService推送到哈希图中。以后,我可以从哈希图中调用期货取消。尽管结果是正确的,但后来我在Callable过程中命中了断点,就好像Future cancel()无效。我认为这里可能是两个不同的引用的情况(即使在断点时引用ID被列出为相同),但我想知道是否有些专家可以插手。代码如下所示: 我允许处理继续进行(这是一个在任务传入时提交任务的循环),以后我可
问题内容: 我有一个调用一些不检查线程中断的代码。调用之后,该方法将立即抛出(如预期的那样)。但是,由于后台任务的代码从不检查其线程是否被中断,因此它很乐意继续执行。 是否有等待后台任务 实际 完成的标准方法?我希望显示“正在取消…”消息或某种类似的内容,直到任务终止为止。(我确信如果有必要,我总是可以在worker类中使用一个标志来完成此操作,只需寻找其他解决方案即可。) 问题答案: 我玩了一点
我有2个期货(数据库表上的2个操作),我希望在保存修改之前检查两个期货是否都成功完成。 现在,我开始第二个未来在第一个(作为依赖),但我知道这不是最好的选择。我知道我可以使用来并行执行两个期货,但即使一个失败,另一个也会被执行(尚未测试) 在这种情况下,如果第一个未来成功执行,则第二个未来可能会失败。我想恢复第一个未来的更新。我听说过SQL事务,似乎是这样的东西,但是如何呢? 在我的情况下,理解要
问题内容: 我正在使用Java 8可完成的期货。我有以下代码: 我使用runAsync计划执行等待闩锁的代码。接下来,我取消了将来,希望将被中断的异常抛出内部。但是似乎线程在await调用上仍然处于阻塞状态,即使将来被取消(断言通过)也永远不会抛出InterruptedException。使用ExecutorService的等效代码可以正常工作。是CompletableFuture中的错误还是我的
我将未来从ExecutorService推送到哈希映射中。稍后,我可以在散列图中调用Futures上的cancel。虽然结果是真的,但我后来在可调用过程中遇到了断点,好像Future cancel()没有任何效果。我认为这里可能有两个不同的引用(即使在中断时引用ID是一样的),但我想知道是否有一些专家可以插话。代码如下所示: 我允许继续处理(这是一个在传入任务时提交任务的循环),稍后我可能会尝试通