gpt4 book ai didi

Java:WAITINGScheduledFuture的Get方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:55:54 25 4
gpt4 key购买 nike

请考虑以下代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com