4

我正在使用 commons VFS 来监视某些文件夹的更改(主要是插入新文件),程序应该永久运行,我使用以下代码

FileSystemManager fsManager = VFS.getManager();
FileObject listendir = fsManager.resolveFile(path);
DefaultFileMonitor fm = new DefaultFileMonitor(new VfsListener());
fm.setRecursive(true);
fm.addFile(listendir);
fm.start();

其中 path 是文件夹路径,而 VfsListener 是一个实现 FileListener 的类,当我运行程序时它运行然后立即关闭,当我在 fm.start() 之后添加它时:

Thread.sleep(100000)

程序运行一段时间然后在超时后关闭,我不希望这样,我希望程序永久朗姆酒,如果有人知道请回复

4

1 回答 1

5

VFS 将 FileMonitor 线程作为低优先级的守护线程启动。方法 setDaemon(boolean) 的定义指出

将此线程标记为守护线程或用户线程。当唯一运行的线程都是守护线程时,Java 虚拟机退出。

该方法必须在线程启动之前调用。

这就是只要您在主线程中“睡眠”,您的程序就可以工作的原因。但是,如果您将此程序作为独立的 java 程序运行,这只是一个问题。如果您在 Jboss 之类的应用服务器中运行相同的代码,那么代码就可以正常工作。

如果您仍然希望独立程序无限期等待,您可以修改程序以使用 ThreadPoolExecutor,它实际上将等待新任务在任务队列中可用。

public static void main(String[] args) throws FileSystemException {
    Executor runner = Executors.newFixedThreadPool(1);
    runner.execute(new Runnable() {

        @Override
        public void run() {
            FileObject listendir = null;
            try {
                FileSystemManager fsManager = VFS.getManager();
                listendir = fsManager.resolveFile(absolutePath);
            } catch (FileSystemException e) {
                e.printStackTrace();
            }
            DefaultFileMonitor fm = new DefaultFileMonitor(new FileListener() {

                @Override
                public void fileDeleted(FileChangeEvent event) throws Exception {
                    System.out.println(event.getFile().getName().getPath()+" Deleted.");
                }

                @Override
                public void fileCreated(FileChangeEvent event) throws Exception {
                    System.out.println(event.getFile().getName().getPath()+" Created.");
                }

                @Override
                public void fileChanged(FileChangeEvent event) throws Exception {
                    System.out.println(event.getFile().getName().getPath()+" Changed.");
                }
            });
            fm.setRecursive(true);
            fm.addFile(listendir);
            fm.start();
        }
    });
}

希望这可以帮助。

于 2013-07-23T10:38:29.150 回答