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
后,您可以评估该标志,然后在设置该标志时优雅地退出