Java 如何停止运行计时器任务

Java 如何停止运行计时器任务,java,timer,Java,Timer,我正在尝试制作一个简单的计时器,在指定的秒数后播放嘟嘟声。我设法让它工作,但定时器任务在哔的一声后继续运行。现在我要停止执行吗? 这是我的密码: 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

我正在尝试制作一个简单的计时器,在指定的秒数后播放嘟嘟声。我设法让它工作,但定时器任务在哔的一声后继续运行。现在我要停止执行吗? 这是我的密码:

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

cancel()
应执行此操作-
cancel
停止取消给定的
TimerTask
/
计时器

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

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

以下是对我有效的建议(也使用了purge()建议):


isStart=true;//如果调用了true timmer函数countiue,则时间被取消
定时器=新定时器(); timer.schedule(新TimerClass(),0,5000)


从这里抄来的我试过了,没用。在您的示例中,run将如何更改为false?我刚在哔的一声后直接调用了timer.cancel(),它就工作了。当然,这取决于你。你可以保持定时,比如在Baadshah的链接中,或者使用其他条件。你想什么时候停止哔哔声?那你为什么要使用TimerTask?为什么不直接使用:'Toolkit.getDefaultToolkit().beep()?请注意,调用.cancel()会杀死计时器(因此是“调度”部分),而不会杀死任何正在运行的计时器任务。它会终止未来的任务,但不会终止当前正在运行的任务(“终止此计时器,丢弃任何当前计划的任务。不会干扰当前正在执行的任务(如果存在)。”)在当前示例中,没有人关心,因为这只是概念证明,但仍然需要提及。对不起。发帖后我很快就明白了这一点。我必须将timer声明为final,并在run()方法中发出嘟嘟声后调用timer.cancel()。不确定从内部类中调用局部变量方法是否是一个很好的解决方案,但是…会取消计划任务,但不会取消活动任务。好吧,我想在这个例子中这并不重要。那么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);
    }
}
class TimerClass extends TimerTask {
    
    public void run() {
        
        if (isStart) {
           yourFunction();
        }else {
            cancel();
        }

    }
}