gpt4 book ai didi

java - 如何在应用程序关闭时终止 WatchService?

转载 作者:行者123 更新时间:2023-11-30 07:01:05 25 4
gpt4 key购买 nike

我有一个 WatchService 为以下代码抛出一个 ClosedWatchServiceException:

final WatchService watchService = FileSystems.getDefault().newWatchService();   

Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
watchService.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});

WatchKey key = null;
while (true) {
key = watchService.take(); //throws ClosedWatchServiceException
//execution
}

如何在不出现异常的情况下安全地关闭服务?或者我应该忽略关闭,因为在终止应用程序时任何线程都会被杀死?

最佳答案

首先请注意,您的代码没有任何问题。您只需要在关机期间优雅地处理 ClosedWatchServiceException。这是因为在 jvm 关闭执行期间,正在执行 watchService.take() 的线程在该操作中被阻塞。所以一旦watch服务关闭,被阻塞的线程就会被解除阻塞。

您可以通过在调用 watchService.close() 之前中断正在运行 watchService.take() 的线程来防止这种情况发生。这应该会为您提供一个您可以处理的 InterruptedException。但是 take 的约定并没有明确说明抛出异常时所考虑的事件顺序。所以您仍然可能以 ClosedWatchServiceException 结束。

因此您可以使用 volatile 标志来指示应用程序关闭。捕捉到 ClosedWatchServiceException 后,您可以评估标志,然后在标志已设置时正常退出。

关于java - 如何在应用程序关闭时终止 WatchService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30070925/

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