如何停止运行TimerTask

Zim*_*Zim 17 java timer

我正在尝试制作一个简单的计时器,在指定的秒数后发出蜂鸣声.我设法让它工作,但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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*agt 39

您需要通过调用以下方法取消计时器

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

这将取消任务,所以这样的事情会起作用:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,调用.cancel()会杀死Timer(因此"调度"部分),而不是任何正在运行的TimerTask.它会杀死未来的任务,但不会杀死当前运行的任务("终止此计时器,丢弃任何当前计划的任务.不会干扰当前正在执行的任务(如果存在).")在当前示例中,没有人关心它是因为它是只是一个概念证明,但仍需要提及 (4认同)

Zim*_*Zim 5

这是对我有用的东西(也使用了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);
    }
}
Run Code Online (Sandbox Code Playgroud)