当前位置: 首页 > 知识库问答 >
问题:

未来取消方法留档

卫学真
2023-03-14

根据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。

共有1个答案

督瑞
2023-03-14
  1. 在<代码>取消(…)之后,isDone()应始终为true。无论什么取消(…) 返回
  2. 如果<代码>取消(…)返回true这意味着此未来现在被取消,并且isCancelled()==true
  3. 如果<代码>取消(…)返回false,这意味着完成不是由于调用cancel()导致的
  4. 取消(false)意味着取消方法不应尝试取消试图在未来完成的任务(“任务”的含义取决于未来的实现),任务将继续运行,但未来将被取消(isDone()==true)
  5. 取消(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是一样的),但我想知道是否有一些专家可以插话。代码如下所示: 我允许继续处理(这是一个在传入任务时提交任务的循环),稍后我可能会尝试通