TimerTask持续运行

mak*_*kko 5 java multithreading schedule task

我对 Java 中 Timer 类的行为有疑问。这是代码: http: //pastebin.com/mqcL9b1n

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

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

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

正如我所看到的,在“foo()”函数结束后,对 Timer 对象的“最后一个实时引用”就消失了。唯一安排的任务就是“是!” 已执行的任务,所以我猜想在进程打印“是!”之后,Timer 对象应该结束并且进程应该终止。

这里发生了什么?

chu*_*ubs 1

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

try {
   timer = new Timer();
   timer.schedule( new SysPrint(), 200 );
} finally {
   timer.cancel();
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这不是我问题的答案。甚至从来没有运行过“是的!” 也许打印。它安排它,然后取消线程。 (2认同)