Java.util.Timer - 主线程结束时进程继续

Java.util.Timer - Process continue when main thread end

我有这个简单的代码使用 util.Timer

public class CheckDBAccessListOpenAccesses extends TimerTask {
    public static void main(String[] args) {
        CheckDBAccessListOpenAccesses object = new CheckDBAccessListOpenAccesses();
    }

    private CheckDBAccessListOpenAccesses() {

        System.out.println("Start");
        Timer whatAccessAreOpen = new Timer();
        whatAccessAreOpen.scheduleAtFixedRate(this,  TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1));
        Thread.sleep(100*60*1000);
        System.out.println("finish");
    }

    @Override
    public void run() {
         System.out.println("one minute");
    }

}

当我 运行 代码时,进程 运行 永远存在。 我希望进程在主线程结束时停止。为什么定时器让进程保持活动状态?有什么办法可以预防吗?

嗯,那是在 Timer 的 API 中。

Timer#scheduleAtFixedRate方法:

Schedules the specified task for repeated fixed-rate execution, beginning at the specified time. Subsequent executions take place at approximately regular intervals, separated by the specified period.

[...]

您可能希望使用 Timer#schedule 进行一次性操作。

否则,您可能真正想要的是让 Timer 对象在您的主线程中可见,这样您就可以在希望取消计划操作时调用 Timer#cancel ,例如当您的主线程终止时。

Java有两种线程:用户线程和守护线程。用户线程阻止 JVM 终止,而守护线程则不会。默认情况下,Timer 由用户线程支持,除非在构造函数中将其指定为 运行 作为守护进程。

为了防止 Timer 使进程保持活动状态,请使用以下实例化 Timer:

new Timer (true)

参见:https://docs.oracle.com/javase/8/docs/api/java/util/Timer.html#Timer-boolean-