如何通知线程更改
How to notify thread of changes
我创建了一个 class FolderObserver,它观察我项目中的一个文件夹是否有更改(文件 created/file 已删除)。我的 class 正在实现 Runnable 接口(我正在使用来自 apache commons 的 classes FileAlterationObserver、FileAlterationMonitor、FileAlterationListener)。
在我的主 class 中,我以我的 FolderObserver 对象作为参数启动了一个线程。
我想知道的是,如何将已发生的更改通知我的线程?例如,当我的文件夹中创建了一个新文件时。
这是我的 class 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());
}
}
}
这就是我从主线程创建和启动线程的方式 class:
FolderObserver observer = new FolderObserver();
Thread t = new Thread(observer);
t.start();
您在 FolderObserver
中创建了一个内部接口。
public interface MyTrueObserver(){
public void notifySmthChanged();
}
您现在可以通过
在主 class 中实现 class
public class MyMainClass implements MyTrueObserver()
你定义接口方法
public void notifySmthChanged(){
// I got called Do smth!
}
最后,您在主帖中引用了您的帖子 class。
并在这里调用它
@Override
public void onFileCreate(File file) {
referenceObjectToMainClass.notifySmthChanged();
}
我创建了一个 class FolderObserver,它观察我项目中的一个文件夹是否有更改(文件 created/file 已删除)。我的 class 正在实现 Runnable 接口(我正在使用来自 apache commons 的 classes FileAlterationObserver、FileAlterationMonitor、FileAlterationListener)。
在我的主 class 中,我以我的 FolderObserver 对象作为参数启动了一个线程。 我想知道的是,如何将已发生的更改通知我的线程?例如,当我的文件夹中创建了一个新文件时。
这是我的 class 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());
}
}
}
这就是我从主线程创建和启动线程的方式 class:
FolderObserver observer = new FolderObserver();
Thread t = new Thread(observer);
t.start();
您在 FolderObserver
中创建了一个内部接口。
public interface MyTrueObserver(){
public void notifySmthChanged();
}
您现在可以通过
在主 class 中实现 classpublic class MyMainClass implements MyTrueObserver()
你定义接口方法
public void notifySmthChanged(){
// I got called Do smth!
}
最后,您在主帖中引用了您的帖子 class。
并在这里调用它
@Override
public void onFileCreate(File file) {
referenceObjectToMainClass.notifySmthChanged();
}