我使用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会使进程保持活动状态?有没有办法阻止它?
答案 0 :(得分:3)
Java有两种类型的线程:用户线程和守护程序线程。用户线程阻止JVM终止,守护程序线程不会。默认情况下,Timer由用户线程支持,除非它被指定在构造函数中作为守护程序运行。
为防止Timer使进程保持活动状态,请使用以下命令实例化Timer:
new Timer (true)
请参阅:https://docs.oracle.com/javase/8/docs/api/java/util/Timer.html#Timer-boolean-
答案 1 :(得分:1)
嗯,Timer
的API中的内容。
从指定时间开始,为重复的固定速率执行计划指定的任务。随后的执行大约定期进行,以指定的时间段分开。
[...]
您可能希望使用Timer#schedule进行一次性操作。
否则,您可能真正想要的是从主线程中看到Timer
对象,因此当您希望取消预定操作时,可以在其上调用Timer#cancel,例如当你的主线程终止时。