如何在应用程序关闭时终止监视服务?



我有一个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()的线程在该操作中被阻塞。因此,一旦监视服务关闭,被阻止的线程将被取消阻止。

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

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

相关内容

  • 没有找到相关文章

最新更新