我有一个关于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对象的最后一个实时引用消失并且所有未完成的任务都完成执行之后,timer的任务执行线程优雅地终止(并成为垃圾收集的对象)。
在我看来,在'foo()‘函数结束后,对Timer对象的“最后一个活动引用”就消失了。唯一被安排的任务是“是!”任务,所以我猜在进程打印"Yes!“之后,Timer对象应该结束,进程也应该终止。
这里发生何事?
发布于 2010-08-17 11:12:35
Java没有退出,因为运行计时器的线程仍在运行。在Java退出之前,您必须将该线程标记为守护线程。您可能无法访问线程本身,因此除非Timer具有标记它的方法,否则您将很难做到这一点。您需要在finally子句中手动停止它。
try {
timer = new Timer();
timer.schedule( new SysPrint(), 200 );
} finally {
timer.cancel();
}发布于 2019-11-24 01:17:33
我相信下面的代码应该可以做到这一点。
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;
}发布于 2020-03-14 16:40:59
当您创建Timer对象时。将创建一个TimerThread。它是运行你的任务的内部线程。您可以查看TimerThread的run()方法。您可以看到它有一个while循环。
private void mainLoop() {
while (true) {....TimerThread没有设置为守护进程,所以main方法完全执行,jvm不存在。
这就是为什么你的程序总是在运行,而且不会停止。
https://stackoverflow.com/questions/3499030
复制相似问题