在java中延迟一段时间后调用方法

时间:2013-09-04 11:30:24

标签: java multithreading delay

场景如下:

在我的应用程序中,我打开了一个文件,更新并保存。一旦文件保存事件被触发,它将执行一个方法abc()。 但现在,我希望在保存事件被解雇后添加延迟,比如1分钟。所以我添加了Thread.sleep(60000)。现在它在1分钟后执行方法abc()。直到现在一切正常。

但假设用户在1分钟内保存了3次文件,则该方法在每1分钟后执行3次。我想在第一次使用最新文件内容调用后的下一分钟内执行一次方法。

我该如何处理这种情况?

2 个答案:

答案 0 :(得分:13)

使用TimerTimerTask

Timer

中创建YourClassType类型的成员变量

让我们说:private Timer timer = new Timer();

,您的方法将如下所示:

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
}

答案 1 :(得分:0)

如果您正在使用Thread.sleep(),只需让静态方法将静态全局变量更改为可用于指示阻止方法调用的内容吗?

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;
    }
}

这有什么理由不起作用吗?