2013-09-04 10 views
9

Scenario è come:Metodo di chiamata dopo qualche ritardo in java

Nella mia applicazione, ho aperto un file, l'ho aggiornato e salvato. Una volta che l'evento salvato dal file è stato attivato, verrà eseguito un metodo abc(). Ma ora, voglio aggiungere il ritardo dopo che l'evento di salvataggio viene sparato, diciamo 1 minuto. Quindi ho aggiunto Thread.sleep(60000). Ora esegue il metodo abc() dopo 1 minuto. Fino ad ora tutto funziona bene.

Ma supponiamo che l'utente abbia salvato il file 3 volte in 1 minuto, il metodo viene eseguito 3 volte dopo ogni 1 minuto. Voglio eseguire il metodo solo una volta nel prossimo 1 minuto dopo il primo salvataggio chiamato con il contenuto del file più recente.

Come posso gestire tale scenario?

+1

utilizzare una data di scadenza –

+2

Utilizzare 'ScheduledExecutorService'. Salva il futuro restituito dal metodo 'schedule' e' cancel' esso se c'è un'altra azione di salvataggio in seguito. –

+4

Duplicato di http://stackoverflow.com/questions/2258066/java-run-a-function-after-a-specific-number-of-seconds – Swapnil

risposta

12

Usa Timer e TimerTask

creare una variabile membro di tipo Timer in YourClassType

diciamo: private Timer timer = new Timer();

e il metodo sarà simile a questo:

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

Una singola istanza di 'Timer' funzionerebbe; solo le * attività * devono essere cancellate e riprogrammate. –

+0

ok buon punto –

0

Se stai usando Thread.sleep(), basta cambiare il metodo statico una variabile globale statica a qualcosa che puoi usare per indicare il blocco della chiamata al metodo?

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

C'è qualche motivo per cui questo non funzionerebbe?

Problemi correlati