Java:如何等待fileChanged执行?

Java:如何等待fileChanged执行?,java,multithreading,file-io,concurrency,file-monitoring,Java,Multithreading,File Io,Concurrency,File Monitoring,我想让我的线程(main/EDT)等到文件发生更改后再等待。DefaultFileMonitor扩展了Runnable,因此在自己的线程中运行。以下是SSCE: import java.io.File; import org.apache.commons.vfs.*; import org.apache.commons.vfs.impl.DefaultFileMonitor; public class FileChangeListener implements FileListener {

我想让我的线程(main/EDT)等到文件发生更改后再等待。DefaultFileMonitor扩展了Runnable,因此在自己的线程中运行。以下是SSCE:

import java.io.File;
import org.apache.commons.vfs.*;
import org.apache.commons.vfs.impl.DefaultFileMonitor;

public class FileChangeListener implements FileListener {
    DefaultFileMonitor fm;
    public final static File logFile = new File("t.txt");

 public void startListening() throws FileSystemException {
    final FileSystemManager fsManager = VFS.getManager();
    final FileObject listendir = fsManager.toFileObject(logFile);

    fm = new DefaultFileMonitor(this);
    fm.addFile(listendir);
    fm.start();
}

     @Override
public void fileCreated(FileChangeEvent fce) throws Exception {
    fileChanged(fce);
}

@Override
public void fileDeleted(FileChangeEvent fce) throws Exception {
    //hmm..why deleted?
}

@Override
public void fileChanged(FileChangeEvent fce) throws Exception {
    System.out.println("fileChanged executed");
}
}
主要问题:

import java.io.PrintWriter;

public class App {

public static void main(String[] args) {
    FileChangeListener fcl = new FileChangeListener();
    try {
        fcl.startListening();
        final PrintWriter printWriter = new PrintWriter(FileChangeListener.logFile);
        printWriter.println("Hello Threads!");
        printWriter.close();

        //EXECUTE THE FOLLOWING ONLY AFTER fileChanged
        System.out.println("Mission complete.");
    } catch (Exception ex) {
    }
}
}

您可以使用“条件”在这两者之间进行通信:

基本上,创建一个新的“共享”
条件(比如
fileChanged
)。现在,只要文件发生更改(在
fileChanged()
中),就会触发此条件(
fileChanged.signal()
)。在主代码中,等待此条件发生(
fileChanged.wait()

希望你能明白


为了使多个代码单元可以访问该条件,我可以这样想(按优先顺序递减):

  • 假设您需要的条件与所听文件的数量一样多,请创建一个工厂方法
    getCondition(String file path/name/attribute)
    ,该方法将基于文件(其路径或名称或其他属性)返回
    条件
    对象。在所有情况下都使用此工厂方法获取条件。工厂应在内部为每个要侦听的新文件创建
    new condition()
    实例,并且必须在文件处理完成后丢弃旧实例(因此,您可能还应添加
    destroy/deleteCondition(字符串文件)
    方法。)
  • 将条件存储为listener类中的
    public
    字段(如果有可用的listener实例,则可能是一种黑客行为)
  • 将条件存储为listener类中的
    公共静态
    字段(如果整个过程中只有一个listener实例,则有点像黑客攻击)

  • 为什么?FileChangeListener是一个回调:它是在事件发生时执行的。在这种特定情况下,您刚刚关闭了文件,因此您知道该文件的任务已经完成,所以只需继续下一步。我不明白您为什么需要FileChangeListener。

    将以下内容附加到App.main(…)在printWriter.close()之后:

    并在System.out.println(“fileChanged executed”)之后将以下内容附加到FileChangeListener.fileChanged(..):


    任何示例代码(javadoc中给出的代码除外)?我如何共享条件,使其公开?假设使用<代码>条件的代码是明确的,要使条件可供多个代码单元访问,请参阅答案编辑。您是否可以像我在回答中所做的那样更改示例代码以包含您的答案?这正是您发布的代码,我对此进行了评论。如果您想发布真实的代码,我将我也会对此发表评论。
                synchronized (fcl) {
                    fcl.wait();
                }
                //EXECUTE THE FOLLOWING ONLY AFTER fileChanged
                System.out.println("Mission complete.");
    
    synchronized (this) {
            this.notifyAll();
        }