ClosedWatchServiceException

ClosedWatchServiceException

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

09-26 20:34