简体   繁体   English

如何通知线程更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM