Java:WAITINGScheduledFuture的Get方法

标签 java future

请考虑以下代码:

public static void main(String... args) throws InterruptedException, ExecutionException {
    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
    ScheduledFuture<?> future =
        executor.scheduleAtFixedRate(Dummy::iterate,
                                     0,
                                     1,
                                     TimeUnit.SECONDS);
    TimeUnit.MILLISECONDS.sleep(1500);
    executor.shutdown();
    executor.awaitTermination(1, TimeUnit.MILLISECONDS);
    System.out.println("Getting the future...");
    future.get();
    System.out.println("Got the future...");
    System.out.println("Finished");
  }

  private static void iterate(){
    System.out.println("Iterating... counter is: " + counter++);
    try {
      TimeUnit.MILLISECONDS.sleep(900);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

请注意 executor.awaitTermination(...) 命令 future.get() 命令在 1500 毫秒后发生,这意味着在 的中间迭代()方法。
这意味着 awaitTermination(...) 将返回 false,因为计划任务尚未完成。

现在,future.get() 将永远等待。任务将完成并且服务不会启动其他任务,但是 get() 永远不会返回。

解决方法是询问 isDone() 的 future ,并且只有在完成后才询问结果。

我的问题是到底发生了什么?
看起来如果 shutDown() 在迭代期间发生,则 ScheduledThreadPool 将以某种方式停止,这意味着将没有可用的 future 。那么为什么会这样呢?我查看了文档,但找不到任何表明此问题的引用资料。这种情况是否可能导致未完成的 future ,以及后来的 future 不可用?

最佳答案

如果你更换你的:

future.get();

类似于:

future.get(2000,TimeUnit.MILLISECONDS);

然后您会看到 java.util.concurrent.TimeoutException 异常发生。 并且当阻塞操作超时时抛出此异常。指定超时的阻塞操作需要一种方法来指示超时已发生。对于许多这样的操作,可以返回一个指示超时的值;当这不可能或不可取时,应声明并抛出 TimeoutException。

关于Java:WAITINGScheduledFuture的Get方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34785510/

相关文章:

java - 找不到符号变量 k

java - 如何使用 2 个 JPanel 对象对齐 JButton 以形成基本的 java GUI

java - gRPC:创建阻塞或 future stub

object - Dart 和 flutter : Need help understanding how to capture futures

c++ - 我的机器上的 std::promise 是否损坏(使用 g++-mp)?

list - flutter 如何在初始化状态下使用 future 的异步方法

java - LMDB Java 检索具有相同键的所有值

java - 无法将数据插入 SQLite 表

JavaFX 8 : Putting a default "x" mark via css if the checkbox is deselected

java - Spring @Async 与 future