我有一个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
。这是因为正在执行watchService.take()
的线程在jvm shutdown执行期间被阻止在该操作中。因此,在关闭监视服务后,将立即解除阻塞线程。
您可以通过在调用watchService.take()
之前中断正在运行watchService.close()
的线程来防止此情况。这应该为您提供一个可以处理的InterruptedException
。但是take
的约定没有明确说明引发异常时要考虑的事件顺序。因此,您仍然可以以ClosedWatchServiceException
结尾。
因此,您可以使用volatile标志来指示应用程序关闭。捕获ClosedWatchServiceException
后,您可以评估该标志,然后在设置了该标志的情况下正常退出。