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

时间:2013-09-06 18:46:29

标签: java multithreading 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()关闭watchService时,我得到另一个例外:ClosedWatchServiceException

如何关闭WatchService,没有任何例外情况? 抱歉我的英文不好..

1 个答案:

答案 0 :(得分:6)

您正在进行例外处理,因为您没有控制您的UI事件。

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

您获得NullPointerException key,因为您在初始化之前尝试在实例上调用cancel()。我猜它在你班上的某个地方被宣布为

private WatchKey key;

默认情况下,实例引用类型变量初始化为null。如果你的执行从未指引你完成

key = watchService.take(); 

然后key将保持null