我有一个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
}
如何在不获取异常的情况下安全关闭服务?或者我应该忽略关闭,因为终止应用程序时任何线程都被杀死了吗?
答案 0 :(得分:4)
首先请注意,您的代码没有任何问题。您只需要在关机期间优雅地处理ClosedWatchServiceException
。这是因为在jvm关闭执行期间,在该操作中阻止正在执行watchService.take()
的线程。因此,一旦关闭监视服务,阻塞的线程就会被解除阻塞。
您可以通过在调用watchService.take()
之前中断正在运行watchService.close()
的主题来阻止此操作。这应该给你一个你可以处理的InterruptedException
。但是take
的合同并没有明确说明在抛出异常时考虑的事件顺序。所以你仍然可以得到ClosedWatchServiceException
。
因此,您可以使用volatile标志来指示应用程序关闭。捕获ClosedWatchServiceException
后,您可以评估该标志,然后在设置该标志时正常退出。