我正在使用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)
程序运行了一段时间,然后在超时后关闭,我不希望这样,我希望程序永久朗读,如果有人知道请回复
答案 0 :(得分: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();
}
});
}
希望这会有所帮助。