【问题标题】:How to stop Java WatchService when is waiting for key?等待密钥时如何停止Java WatchService?
【发布时间】:2013-09-06 18:46:29
【问题描述】:

我正试图在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() 关闭watchService 时,我得到另一个异常:ClosedWatchServiceException

如何在没有任何异常的情况下关闭WatchService? 对不起我的英语不好..

【问题讨论】:

  • 请告诉我们你得到的异常。
  • @Sotirios Delimanolis 更新我的问题
  • 尝试在key.cancel() 行之前打印key,以确保key 不为空。
  • 在使用户界面可见之前将key设置为非空值,以防止出现 NullPointerException。

标签: java multithreading watchservice


【解决方案1】:

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

当您尝试使用已调用 close() 方法的 WatchService 时,会出现 ClosedWatchServiceException。所以你可能在调用close() 之后调用watchService.take() 或其他WatchService 方法。在您关闭WatchService 并立即抛出Exception 后,take() 方法可能会解除阻塞。

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

private WatchKey key;

默认情况下,实例引用类型变量初始化为null。如果你的执行永远不会带你完成

key = watchService.take(); 

那么key 将保持为null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多