12

Scenario is like :

In my application, I opened one file, updated it and saved. Once the file saved event get fired and it will execute one method abc(). But now, I want to add delay after save event get fired, say 1 minute. So I have added Thread.sleep(60000). Now it execute the method abc() after 1 minute. Till now all works fine.

But suppose user saved file 3 times within 1 minute, the method get executed 3 times after each 1 minute. I want to execute method only one time in next 1 minute after first save called with latest file content.

How can I handle such scenario?

Naresh J
  • 2,087
  • 5
  • 26
  • 39

2 Answers2

15

Use Timer and TimerTask

create a member variable of type Timer in YourClassType

lets say: private Timer timer = new Timer();

and your method will look something like this:

public synchronized void abcCaller() {
    this.timer.cancel(); //this will cancel the current task. if there is no active task, nothing happens
    this.timer = new Timer();

    TimerTask action = new TimerTask() {
        public void run() {
            YourClassType.abc(); //as you said in the comments: abc is a static method
        }

    };

    this.timer.schedule(action, 60000); //this starts the task
}
Philipp Sander
  • 10,139
  • 6
  • 45
  • 78
0

If you are using Thread.sleep(), just have the static method change a static global variable to something that you can use to indicate blocking the method call?

public static boolean abcRunning;
public static void abc()
{
    if (YourClass.abcRunning == null || !YourClass.abcRunning)
    {
        YourClass.abcRunning = true;
        Thread.Sleep(60000);
        // TODO Your Stuff
        YourClass.abcRunning = false;
    }
}

Is there any reason this wouldn't work?