取消匿名 TimerTask

Cancel anonymous TimerTask

boolean timing = true; /* this is a global attribute and its only here for context */
Timer t = new Timer();
t.schedule(new TimerTask() {
        @Override
        public void run() {
            Platform.runLater(() -> {
                new Thread(() -> {
                    if (!timing) {
                        try {
                            tt.cancel(); /* I want to cancel this if timming is false*/
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        update();
                    }
                }).run();
            });
        }
}, 10, 10);

我想知道是否可以取消它自身内部的特定 TimerTask,请注意 "tt" 只是一个例子,我不知道还能称呼它什么。谢谢。

Timers 有自己的后台线程。除非你的任务需要很长时间才能 运行,否则你不需要在任务的 #run() 方法中创建一个新线程(你也不应该这样做)。

您可以通过使实例final:

取消定时器的后续执行
final Timer t = new Timer();
t.schedule(new TimerTask() {
    @Override
    public void run() {
        // Do work.
        if (!timing) {
            t.cancel();
        }
    }
});

(为简洁起见省略了异常处理。)

如果您只想取消任务本身(允许计时器安排的其他任务继续 运行ning),只需调用任务实例的 #cancel() 方法即可:

if (!timing) {
    this.cancel();
}

您还应确保已声明 timing 变量 volatile。如果不这样做,该值可能会缓存在每个线程中,您将无法观察到变化。

你想一个新的方法来取消Timer怎么样?

private void cancelTimer(Timer t)
{
    t.cancel();
}

您还需要完成 Timer 决赛。