如何在应用程序关闭时终止 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
后,您可以评估标志,然后在设置标志后优雅地退出。
我有一个 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
后,您可以评估标志,然后在设置标志后优雅地退出。