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



我有一个使用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");
    }
}

当我运行代码时,进程将永远运行。我希望进程在主线程结束时停止。为什么计时器使进程保持活动状态?有办法防止它吗?

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

要防止计时器使进程保持活动状态,请使用实例化计时器

new Timer (true)

请参阅:https://docs.oracle.com/javase/8/docs/api/java/util/Timer.html#Timer-布尔值-

好吧,这在Timer的API中。

Timer#scheduleAtFixedRate方法:

从指定时间开始,安排指定任务以重复固定速率执行。随后的处决大约每隔一段时间进行,间隔一段时间。

[…]

您可能需要将Timer#计划用于一次性操作。

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

最新更新