Java 如何在应用程序关闭时终止WatchService?
我有一个Java 如何在应用程序关闭时终止WatchService?,java,watchservice,Java,Watchservice,我有一个WatchService,它为以下代码抛出一个ClosedWatchServiceException: final WatchService watchService = FileSystems.getDefault().newWatchService(); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { try { watchServi
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关机执行期间在该操作中被阻塞。因此,一旦watch服务关闭,阻塞的线程将被解锁
您可以通过在调用watchService.close()
之前中断运行watchService.take()
的线程来防止这种情况。这将为您提供一个可以处理的InterruptedException
。但是,take
的契约并没有明确说明抛出异常时要考虑的事件顺序。因此,您仍然可以得到ClosedWatchServiceException
因此,您可以使用volatile标志来指示应用程序关闭。捕捉到ClosedWatchServiceException
后,您可以评估该标志,然后在设置该标志时优雅地退出