2

我有一个为以下代码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
}

如何在不出现异常的情况下安全地关闭服务?或者我应该忽略关闭,因为在终止应用程序时无论如何都会杀死任何线程?

4

1 回答 1

5

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

watchService.take()您可以通过在调用之前中断正在运行的线程来防止这种情况发生watchService.close()。这应该给你一个InterruptedException你可以处理的。但是合约take并没有明确说明抛出异常时考虑的事件顺序。所以你仍然可以最终得到ClosedWatchServiceException.

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

于 2015-05-06T09:40:01.653 回答