首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TimerTask继续运行

TimerTask继续运行
EN

Stack Overflow用户
提问于 2010-08-17 11:04:01
回答 3查看 9.1K关注 0票数 4

我有一个关于Java中Timer类行为的问题。代码如下:http://pastebin.com/mqcL9b1n

代码语言:javascript
复制
public class Main {

    public static void main(String[] args) {
        Main m = new Main();
        m.foo();
        m = null;
    }

    public void foo() {
        Timer t = new Timer();
        t.schedule(new SysPrint(), 200);
    }

}

class SysPrint extends TimerTask {

    public void run() {
        System.out.println("Yes!");
    }
}

实际情况是,如果您运行该程序,它将打印"Yes!“它不会做其他任何事情(程序不会结束)。

Java文档说:在对Timer对象的最后一个实时引用消失并且所有未完成的任务都完成执行之后,timer的任务执行线程优雅地终止(并成为垃圾收集的对象)。

在我看来,在'foo()‘函数结束后,对Timer对象的“最后一个活动引用”就消失了。唯一被安排的任务是“是!”任务,所以我猜在进程打印"Yes!“之后,Timer对象应该结束,进程也应该终止。

这里发生何事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-17 11:12:35

Java没有退出,因为运行计时器的线程仍在运行。在Java退出之前,您必须将该线程标记为守护线程。您可能无法访问线程本身,因此除非Timer具有标记它的方法,否则您将很难做到这一点。您需要在finally子句中手动停止它。

代码语言:javascript
复制
try {
   timer = new Timer();
   timer.schedule( new SysPrint(), 200 );
} finally {
   timer.cancel();
}
票数 2
EN

Stack Overflow用户

发布于 2019-11-24 01:17:33

我相信下面的代码应该可以做到这一点。

代码语言:javascript
复制
public class Main {
  public static void main(String[] args) {
    Main m = new Main();
    m.foo();
    m = null;
  }

  public void foo() {
    Timer t = new Timer();
    t.schedule(new SysPrint(), 200);
  }
}

class SysPrint extends TimerTask {
  SysPrint(Timer timer) {
    this.timer = timer;
  }

  public void run() {
    System.out.println("Yes!");
    timer.cancel();
  }

  private Timer timer;
}
票数 0
EN

Stack Overflow用户

发布于 2020-03-14 16:40:59

当您创建Timer对象时。将创建一个TimerThread。它是运行你的任务的内部线程。您可以查看TimerThread的run()方法。您可以看到它有一个while循环。

代码语言:javascript
复制
 private void mainLoop() {
    while (true) {....

TimerThread没有设置为守护进程,所以main方法完全执行,jvm不存在。

这就是为什么你的程序总是在运行,而且不会停止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3499030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档