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

时间:2015-05-06 08:04:59

标签: java watchservice

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

如何在不获取异常的情况下安全关闭服务?或者我应该忽略关闭,因为终止应用程序时任何线程都被杀死了吗?

1 个答案:

答案 0 :(得分:4)

首先请注意,您的代码没有任何问题。您只需要在关机期间优雅地处理ClosedWatchServiceException。这是因为在jvm关闭执行期间,在该操作中阻止正在执行watchService.take()的线程。因此,一旦关闭监视服务,阻塞的线程就会被解除阻塞。

您可以通过在调用watchService.take()之前中断正在运行watchService.close()的主题来阻止此操作。这应该给你一个你可以处理的InterruptedException。但是take的合同并没有明确说明在抛出异常时考虑的事件顺序。所以你仍然可以得到ClosedWatchServiceException

因此,您可以使用volatile标志来指示应用程序关闭。捕获ClosedWatchServiceException后,您可以评估该标志,然后在设置该标志时正常退出。