如何在应用程序关闭时终止 WatchService?

How to terminate a WatchService on application shutdown?

我有一个 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.

所以你可以有一个易失性标志来指示应用程序关闭。捕获 ClosedWatchServiceException 后,您可以评估标志,然后在设置标志后优雅地退出。