我有一个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
后,您可以评估标志,然后在设置标志时正常退出。