Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNotify在不同Windows版本上的行为不一致_Java_Windows_Multithreading_Jnotify - Fatal编程技术网

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

Java JNotify在不同Windows版本上的行为不一致,java,windows,multithreading,jnotify,Java,Windows,Multithreading,Jnotify,我们的产品目前使用JDK1.6,因此我们必须依赖JNotify进行文件系统更改。 然而,在测试过程中,我注意到在我的Win7开发环境中工作得非常完美的东西停止在XP和Win server 2003中工作。所以我继续写一个小测试程序。这是它大致的样子 在主类中,我只有以下内容: public static void main(String[] args) { SyncUtil instance = new SyncUtil(); instance.start(); Sca

我们的产品目前使用JDK1.6,因此我们必须依赖JNotify进行文件系统更改。 然而,在测试过程中,我注意到在我的Win7开发环境中工作得非常完美的东西停止在XP和Win server 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类内部没有任何工作,它只是打印日志。 现在,如果我在Windows7/8上运行上面的示例。它会很好用的。 但当我在WinServer2003上测试它时,JNotify停止工作,侦听器根本不会打印任何日志

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

Thread.sleep(60000);
到run函数的末尾,使其等待60秒。 而不是监视1个文件夹,这次我将监视2个,我将它们称为文件夹A和B

在本例中,Win Server 2003计算机上发生的情况是,如果我在60秒内将文件添加到文件夹a,JNotify将正确响应事件并打印日志。即使60秒过去,SyncUtil线程终止,它也会继续工作。但现在我将一个文件添加到文件夹B(即等待60秒后),将不会打印任何内容

总而言之,症状是: 1.在Win7和Win8上,无论线程调用JNotify.addWatch()是否仍然有效,JNotify都将继续工作。 2.在win XP和win server 2003上,当线程调用JNotify.addWatch()时,JNotify可以正确地生成事件。当该线程仍处于活动状态时,至少生成一个事件的路径将在该线程终止后继续被监视。但那个些在线程处于活动状态时并没有生成任何事件的路径在该线程终止后将不起作用

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

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

我对你的问题有点不知所措,你是说“为什么”而不是“什么”?如果是这样的话,那么事实上,我在问题中展示的示例是一个测试程序,旨在模拟更大项目中发生的情况。在那个项目中,我们有一个类,它使用一个“在线线程”来执行一些辅助任务,而JNotify恰好是其中之一。我当然可以把JNotify从这个线程中去掉,但是。。。我知道如何纠正这种奇怪的行为,我只是挠头想知道你为什么知道。:-)是的,我是说为什么。就我所记得的(我写JNotify已经很多年了)-Windows上的JNotify根本不关心哪个线程在添加手表。代码示例提到sleep的原因是,如果没有它,JVM将在这里的简单示例中退出。对于真实世界的程序来说,这不是问题。哦,为了防止简单的示例退出,我在您看到的主函数中添加了s.nextLine()。这将使主线程保持活动状态。作为一种解决方法,请尝试将所有watch add和remove安排到在应用生命周期内保持活动状态的同一线程。这真的很奇怪,需要深入研究才能弄清楚。(可能在本机代码中启用调试,看看是否有什么奇怪的事情发生)。