web-dev-qa-db-ja.com

実行中のTimerTaskを停止する方法

指定した秒数後にビープ音を鳴らす簡単なタイマーを作成しようとしています。なんとか動作させることができましたが、ビープ音の後も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);
    }
}
17
Zim

次のメソッドを呼び出してタイマーをキャンセルする必要があります

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

これによりタスクがキャンセルされるため、次のように機能します。

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;
    }
}
39
Erik Pragt

ここに私のために働いたものがあります(purge()提案も使用しました):

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);
    }
}
5
Zim

cancel()はそれを行う必要があります-cancelは、指定されたTimerTask/Timerのキャンセルを停止します

0
Sean Landsman