Java: 正在等待 ScheduledFuture 的 Get 方法

Java: Waiting on Get Method of ScheduledFuture

请考虑以下代码:

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 毫秒后发生,这意味着在 iterate() 方法的中间。
这意味着 awaitTermination(...) 将 return 为假,因为计划任务尚未完成。

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

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

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

如果您更换您的 :

future.get();

类似于:

future.get(2000,TimeUnit.MILLISECONDS);

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