Java:如何等待fileChanged执行?
我想让我的线程(main/EDT)等到文件发生更改后再等待。DefaultFileMonitor扩展了Runnable,因此在自己的线程中运行。以下是SSCE: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 {
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();
}