2013-09-04 3 views
9

Сценарий похож:Вызов метода после некоторой задержки в java

В моем приложении я открыл один файл, обновил его и сохранил. После того как файл сохраненного события будет запущен, он выполнит один метод abc(). Но теперь я хочу добавить задержку после того, как событие сохранения заработает, скажем, 1 минута. Поэтому я добавил Thread.sleep(60000). Теперь он выполняет метод abc() через 1 минуту. До сих пор все работает нормально.

Но предположим, что пользователь сохранил файл 3 раза в течение 1 минуты, метод запускается 3 раза через каждые 1 минуту. Я хочу выполнить метод только один раз в следующие 1 минуту после первого сохранения с последним содержимым файла.

Как я могу справиться с таким сценарием?

+1

использовать timertask –

+2

Использовать 'ScheduledExecutorService'. Сохраните будущее, возвращенное из метода расписания, и «отмените» его, если позже будет другое действие сохранения. –

+4

Дубликат http://stackoverflow.com/questions/2258066/java-run-a-function-after-a-specific-number-of-seconds – Swapnil

ответ

12

Использование Timer и TimerTask

создать переменную-член типа 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 
} 
+2

Один экземпляр Timer будет работать; только * задачи * должны быть отменены и перенесены. –

+0

хорошо хорошая точка –

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

Есть ли причина, по которой это не сработает?

Смежные вопросы