java - 取消匿名TimerTask

标签 java multithreading

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”只是一个例子,我不知道该怎么称呼它。谢谢。

最佳答案

Timer具有自己的后台线程。除非您的任务需要很长时间才能运行,否则您无需在任务的#run()方法内创建新线程(并且不应这样做)。

您可以通过使实例final取消计时器的后续执行:

final Timer t = new Timer();
t.schedule(new TimerTask() {
    @Override
    public void run() {
        // Do work.
        if (!timing) {
            t.cancel();
        }
    }
});

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

如果您只想取消任务本身(允许计时器安排其他任务继续运行),则对任务实例的#cancel()方法的调用很简单:
if (!timing) {
    this.cancel();
}

您还应该确保将timing变量声明为volatile。否则,该值可能会缓存在每个线程中,并且您将无法观察到更改。

关于java - 取消匿名TimerTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27761848/

相关文章:

java - 在 System.out 上同步

java - jQuery 无法在 FF 或 IE 中工作,但在 Chrome 中工作正常

java - 在eclipse中读取文件

php - Laravel 怎么说,如果线程属于该用户,请允许他

java - 如何在 Java-Web Start 应用程序上读取 Excel 文件

java - 为什么我从 Tomcat 7 收到 404 请求的资源不可用错误

java - Android:不同类文件中的可运行项

java - 使用线程池时出现错误 FutureTask@2c7b84de 被拒绝

multithreading - 专业或通才线程

c# - 互斥 : is this safe?