2013-04-19 14 views
10

Ich versuche, einen einfachen Timer, der einen Signalton nach der angegebenen Anzahl von Sekunden spielt. Ich habe es geschafft, es zu arbeiten, aber die TimerTask läuft nach dem Piepton weiter. Jetzt höre ich die Ausführung auf? Hier ist mein Code:So stoppen Sie eine laufende TimerTask

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

Es tut mir leid. Das habe ich gleich nach dem Posten herausgefunden. Ich musste den Timer als final deklarieren und timer.cancel() nach dem Piepton innerhalb der run() -Methode aufrufen. Nicht sicher, dass es eine großartige Lösung ist, eine lokale Variablenmethode innerhalb einer inneren Klasse aufzurufen, obwohl ... – Zim

Antwort

24

Sie benötigen

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

den Timer abzubrechen, indem Sie die folgenden Methoden aufrufen Diese wird die Aufgabe abbrechen, so etwas wie das würde funktionieren:

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

Von hier kopiert http://stackoverflow.com/questions/1409116/how-to-stop-the-task-scheduled-in-java-util-timer-class –

+0

Ich versuchte dies, es hat nicht funktioniert. Wie wird Lauf in Ihrem Beispiel zu false? Ich habe gerade timer.cancel() direkt nach dem Signalton angerufen und es hat funktioniert. – Zim

+0

Wir werden, das hängt natürlich von Ihnen ab. Du könntest wie in der Verbindung von Baadshah am Timer bleiben oder eine andere Bedingung verwenden. Wann möchten Sie das Piepen stoppen? –

0

cancel() sollte es tun - cancel die Anschläge bricht die gegebene TimerTask/Timer

+0

die geplanten Aufgaben abbricht, aber nicht die aktive. Nun, ich denke, es spielt in diesem Beispiel keine Rolle. – bvdb

+0

Was ist mit ** spülen() **? –

3

Hier ist, was für mich gearbeitet (verwendet, um die Säuberung() Vorschlag auch):

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

Warum funktioniert das? –

Verwandte Themen