2

我有这个简单的 Java 代码,它应该安排一些东西在 1 毫秒内运行然后退出。

import java.util.*;

class A {
    public static void main(String[] args) {
        new Timer().schedule(new TimerTask() {
            public void run() {
                System.out.println("hello");
            }
        }, 1);
        System.out.println("hi");
    }
}

它永远不会退出。为什么?

$ javac A.java && java A
hi
hello

如果我删除设置时间表的代码,它会起作用。为什么?

4

1 回答 1

2

java.util.Timer的文档说:

如果调用者想要快速终止定时器的任务执行线程,调用者应该调用定时器的取消方法。

你应该做的。罗伯特·哈维(Robert Harvey)链接到一些内容,该内容将向您展示如何在您的问题下发表评论。

使用您的代码,这打印了与您的代码相同的内容,但随后退出:

public static void main(String[] args) {
    final Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        public void run() {
            System.out.println("hello");
            timer.cancel();
        }
    }, 1);
    System.out.println("hi");        
}

或者,您可以通过像这样创建计时器来使计时器成为守护进程:

public static void main(String[] args) {
    final Timer timer = new Timer(true);
    timer.schedule(new TimerTask() {
        public void run() {
            System.out.println("hello");
        }
    }, 1);
    System.out.println("hi");
}

问题是这可以在任务运行之前退出并给出如下输出:

hi
<exit>

javadoc解释了public Timer(boolean isDaemon)原因:

创建一个新的计时器,其关联的线程可以指定为作为守护进程运行。如果计时器将用于安排重复的“维护活动”,则调用守护线程,只要应用程序正在运行,就必须执行该活动,但不应延长应用程序的生命周期。

于 2013-05-23T20:59:12.593 回答