作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
请考虑以下代码:
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/
我是一名优秀的程序员,十分优秀!