[英]How to notify thread of changes
I have created a class FolderObserver which observes a folder in my project for changes (file created/file deleted). 我创建了一个FolderObserver类,该类可观察项目中的文件夹以进行更改(已创建文件/已删除文件)。 My class is implementing the Runnable interface (I'm using the classes FileAlterationObserver, FileAlterationMonitor, FileAlterationListener from apache commons).
我的课程正在实现Runnable接口(我正在使用来自Apache Commons的FileAlterationObserver,FileAlterationMonitor,FileAlterationListener类)。
In my main class I start a thread with my FolderObserver object as an argument. 在我的主类中,我以我的FolderObserver对象作为参数启动了一个线程。 What I would like to know is, how can I notify my thread on the changes that have occured?
我想知道的是,如何将发生的更改通知我的线程? For example when a new file has been created in my folder.
例如,当在我的文件夹中创建一个新文件时。
This is my class FolderObserver: 这是我的类FolderObserver:
public class FolderObserver implements Runnable {
private final String DIR = "server/scripts/gremlin-groovy/calculations/";
final long pollingInterval = 5000L;
private File folder;
private FileAlterationObserver observer;
private FileAlterationMonitor monitor;
private FileAlterationListener listener;
public FolderObserver()
{
System.out.println("Creating Runnable");
folder = new File(DIR);
observer = new FileAlterationObserver(folder);
monitor = new FileAlterationMonitor(pollingInterval);
}
@Override
public void run() {
System.out.println("Thread is running");
listener = new FileAlterationListenerAdaptor() {
// Is triggered when a file is created in the monitored folder
@Override
public void onFileCreate(File file) {
try {
// "file" is the reference to the newly created file
System.out.println("Created file : " + file.getCanonicalPath());
} catch (IOException e) {
}
}
// Is triggered when a file is deleted from the monitored folder
@Override
public void onFileDelete(File file) {
try {
// "file" is the reference to the removed file
System.out.println("Removed file : " + file.getCanonicalPath());
//logger.log(LogLevel.DEBUG,logId,"File exists in location '{}'",bool);
} catch (IOException e) {
//logger.log(LogLevel.ERROR, "Received IOException '{}' when trying to remove file", e.toString());
}
}
};
observer.addListener(listener);
monitor.addObserver(observer);
try {
monitor.start();
System.out.println("Monitor started");
//logger.log(LogLevel.DEBUG,logId,"Monitor started");
} catch (Exception e) {
//logger.log(LogLevel.ERROR, "Received Exception '{}' when trying to start monitor", e.toString());
}
}
}
This is how I create and start the thread from my main class: 这是我从主类创建和启动线程的方式:
FolderObserver observer = new FolderObserver();
Thread t = new Thread(observer);
t.start();
You create a inner interface inside your FolderObserver
. 您在
FolderObserver
内部创建一个内部接口。
public interface MyTrueObserver(){
public void notifySmthChanged();
}
You can now implement that class in your main class by doing 您现在可以通过执行以下操作在您的主类中实现该类
public class MyMainClass implements MyTrueObserver()
There you define the interface method 在那里定义接口方法
public void notifySmthChanged(){
// I got called Do smth!
}
Lastly, you reference your thread the main class. 最后,您在主类中引用线程。
And call it here 并在这里叫
@Override
public void onFileCreate(File file) {
referenceObjectToMainClass.notifySmthChanged();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.