如何在等待密钥时停止 Java WatchService



我正在尝试在WatchService工作的地方停止我的线程。但是怎么做呢?我的WatchService正在等待文件夹中的新更新:

key = watchService.take(); 

我在那里开始我的线程:

private void startButtonActionPerformed(ActionEvent e) {
        stateLabel.setText("monitoring...");
        try {
            watchService = FileSystems.getDefault().newWatchService();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        watchThread = new WatchThread(watchService, key);
        Thread t = new Thread(watchThread);
        t.start();
    }

我试图停止:

private void stopButtonActionPerformed(ActionEvent e) {
     try {
        if (watchService!=null) {
            key.cancel();
            watchService.close();
        }
     } catch (IOException e1) {
        e1.printStackTrace();
     }
}

当我尝试执行停止时,我得到了NullPointerException密钥。当我刚刚用watchService.close()关闭监视服务时,我得到了另一个例外:ClosedWatchServiceException

如何毫无例外地关闭WatchService?对不起,我的英语不好..

您遇到的异常正在发生,因为您没有控制 UI 事件。

当您尝试使用已调用其close()方法的WatchService时,会发生ClosedWatchServiceException。因此,您可能在调用close()后调用watchService.take()或其他WatchService方法。关闭WatchService后,take() 方法可能会解锁并立即抛出Exception

您会收到带有key NullPointerException,因为您尝试在初始化实例之前在实例上调用cancel()。我猜它在你的班级的某个地方被声明为

private WatchKey key;

默认情况下,实例引用类型变量初始化为 null 。如果您的执行从未带您通过

key = watchService.take(); 

那么key将保持null.

相关内容

  • 没有找到相关文章

最新更新