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 中。
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-
我有这个简单的代码使用 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 中。
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-