gpt4 book ai didi

java - TimerTask 一直在运行

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:40:36 24 4
gpt4 key购买 nike

我对 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!");
}
}

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

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

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

这里发生了什么?

最佳答案

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

try {
timer = new Timer();
timer.schedule( new SysPrint(), 200 );
} finally {
timer.cancel();
}

关于java - TimerTask 一直在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3499030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com