2013-04-19 12 views
10

Sto provando a creare un semplice timer che riproduca un segnale acustico dopo il numero di secondi specificato. Sono riuscito a farlo funzionare, ma il TimerTask continua a funzionare dopo il segnale acustico. Ora interrompo l'esecuzione? Ecco il mio codice:Come arrestare un TimerTask in esecuzione

import java.util.Scanner; 
import java.util.Timer; 
import java.util.TimerTask; 
import java.awt.Toolkit; 

class Alarm { 

    public static void main(String[] args) { 
     long delay; 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Enter a delay in seconds: "); 
     delay = scan.nextInt()*1000; 

     Timer timer = new Timer(); 

     TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       Toolkit.getDefaultToolkit().beep(); 
      } 
     }; 

     timer.schedule(task, delay); 
    } 
} 
+0

mi dispiace. L'ho capito molto velocemente subito dopo la pubblicazione. Ho dovuto dichiarare il timer come finale e chiamare timer.cancel() dopo il segnale acustico nel metodo run(). Non sono sicuro che sia un'ottima soluzione per chiamare un metodo di variabili locali all'interno di una classe interna sebbene ... – Zim

risposta

24

È necessario annullare il timer chiamando i seguenti metodi

timer.cancel(); // Terminates this timer, discarding any currently scheduled tasks. 
timer.purge(); // Removes all cancelled tasks from this timer's task queue. 

Questo annullerà l'attività, quindi qualcosa del genere funzionerebbe:

import java.util.Scanner; 
import java.util.Timer; 
import java.util.TimerTask; 
import java.awt.Toolkit; 

class Alarm { 

    private static boolean run = true; 

    public static void main(String[] args) { 
     long delay; 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Enter a delay in seconds: "); 
     delay = scan.nextInt()*1000; 

     final Timer timer = new Timer(); 

     final TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       if(run) { 
        Toolkit.getDefaultToolkit().beep(); 
       } else { 
        timer.cancel(); 
        timer.purge(); 
       } 
      } 
     }; 

     timer.schedule(task, delay); 

     // set run to false here to stop the timer. 
     run = false; 
    } 
} 
+0

Copiato da qui http://stackoverflow.com/questions/1409116/how-to-stop-the-task-scheduled-in-java-util-timer-class –

+0

Ho provato questo, non ha funzionato. Come verrà mai eseguito il comando su false nel tuo esempio? Ho appena chiamato timer.cancel() subito dopo il segnale acustico e ha funzionato. – Zim

+0

Lo faremo, dipende da te ovviamente. Potresti tenerti al timer, come nel link di Baadshah, o usare qualche altra condizione. Quando vuoi fermare il segnale acustico? –

0

cancel() dovrebbe farlo - cancel ferma l'annulla la data TimerTask/Timer

+0

annulli le attività pianificate, ma non quella attiva. beh, immagino che non abbia importanza in questo esempio. – bvdb

+0

Che dire di ** purge() **? –

3

Ecco che cosa ha funzionato per me (usato il suggerimento di spurgo() anche):

import java.util.Scanner; 
import java.util.Timer; 
import java.util.TimerTask; 
import java.awt.Toolkit; 

class Alarm { 

    public static void main(String[] args) { 
     long delay; 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Enter a delay in seconds: "); 
     delay = scan.nextInt()*1000; 

     final Timer timer = new Timer(); 

     final TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       Toolkit.getDefaultToolkit().beep(); 
       timer.cancel(); 
       timer.purge(); 
      } 
     }; 

     timer.schedule(task, delay); 
    } 
} 
+0

Perché ha funzionato? –

Problemi correlati