我有一个使用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。