Schedule to run a method at periodic time´

5.9k views Asked by At

I have to schedule a method to be executed when starting and periodically thereafter at intervals of 1 minute.

For that I have done this:

public void init(){
    loadConfig(); //method which needs to be executed periodically

    Timer scheduler = new Timer();
    scheduler.scheduleAtFixedRate(loadConfig(),60000,60000);
}

This is giving an error and it should since the first parameter of scheduleAtFixedRate is of type Runnable.

What I need advice on, is how to make my loadConfig method Runnable and still have it executed when I do loadConfig() before the scheduler starts.

As of now code structure is as follows:

public class name {
    public void init() {
        ...
    }
    ...
    public void loadConfig() {
        ...
    }
}

EDIT: This is what I have already tried

public void init(){
    loadConfig();

    Timer scheduler = new Timer();
    scheduler.scheduleAtFixedRate(task,60000,60000);
}

final Runnable task = new Runnable() {
    public void run() {
        try {
            loadConfig();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};
2

There are 2 answers

4
Lii On BEST ANSWER

Using the following syntax you can create a lambda expression, which will evaluate to an object of type Runnable. When the run method of that object is called the loadConfig method will get called.

scheduler.scheduleAtFixedRate(() -> loadConfig(), 60, 60, TimeUnit.SECONDS);

Lambda expressions is a new Java 8 feature.

In this case it works like this: The arrow, ->, makes the expression into a lambda. () is the argument list, which is empty because there are no argument to the run method. The loadConfig() after the arrow is the body, which works the same way as a method body.

Since scheduleAtFixedRate expects a Runnable as a parameter, that will be the target type of the expression and the lambda will become an object of that type.

1
mthmulders On

Since Runnable is an interface, you need to supply an object that implements that interface. The easiest way (not necessarily the cleanest) would be to write an anonymous inner class that implements that interface.

As you write that object, you'll see you have to implement the run() method. In that method you can simply call the loadConfig() method of the surrounding object.