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。
请考虑以下代码:
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。