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();
}
});
}
希望这可以帮助。