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();
}
});
}
お役に立てれば。