JNotify在不同Windows版本上的不一致行为

时间:2013-09-06 07:13:52

标签: java windows multithreading jnotify

我们的产品目前使用的是JDK 1.6,因此我们必须依靠JNotify进行文件系统更改。 然而,在测试期间,我注意到在Win 7开发环境中运行完美的东西停止在XP中工作并赢得服务器2003.所以我继续编写一个小测试程序。这是大致的样子。

在大班我只有这个:

public static void main(String[] args) {
    SyncUtil instance = new SyncUtil();
    instance.start();

    Scanner s = new Scanner(System.in);
    s.nextLine();
}

SyncUtil是一个扩展线程的类:

    public void run() {
        String path = "D:\\testFolder";
        int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
        boolean watchSubtree = true;
        File file = null;
        try {
            JNotify.addWatch(path, mask, watchSubtree, new Listener());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Listener类里面没有任何工作,它只是打印日志。 现在,如果我在Windows 7/8上运行上面的示例。它会正常工作。 但是当我在Win Server 2003上测试它时,JNotify就会停止工作,而且Listener根本不会打印任何日志。

更有趣的是,如果我尝试让SyncUtil在工作后等待一分钟。如果我添加:

Thread.sleep(60000);

到run函数结束,使其等待60秒。 而不是监视1个文件夹,这次我将监视2,我将它们称为文件夹A和B.

在这种情况下,Win Server 2003计算机上发生的情况是,如果我在60秒等待时间内将文件添加到文件夹A,JNotify将正确响应该事件并打印日志。即使60秒已经过去并且SyncUtil线程终止,它甚至会继续工作。但是现在我将一个文件添加到文件夹B(在60秒等待时间之后),将不会打印任何内容。

总结一下,症状是: 1.在win 7和win 8中,JNotify将继续无视线程是否要求JNotify.addWatch()仍然存活。 2.在win XP和win server 2003上,当线程调用JNotify.addWatch()时,JNotify可以正确生成事件。在该线程终止后,将继续监视在该线程仍处于活动状态时生成至少一个事件的路径。但是那些在所述线程处于活动状态时没有生成任何事件的路径在该线程终止后将无法工作。

现在知道这个模式我正在使用CountDownLatch来解决这个问题,但我真的很好奇为什么会这样。 我觉得这种情况没有任何意义,你认为问题出在哪里? 我倾向于结论可能是Windows触发文件系统事件的方式不同?你认为情况可能如此吗?

1 个答案:

答案 0 :(得分:0)

这很奇怪,但是: 添加手表是一个非常快速的操作,为什么要在线程中添加它们?