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

时间:2016-05-16 12:59:37

标签: java multithreading timer process

我使用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会使进程保持活动状态?有没有办法阻止它?

2 个答案:

答案 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#scheduleAtFixedRate方法:

  

从指定时间开始,为重复的固定速率执行计划指定的任务。随后的执行大约定期进行,以指定的时间段分开。

     

[...]

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

否则,您可能真正想要的是从主线程中看到Timer对象,因此当您希望取消预定操作时,可以在其上调用Timer#cancel,例如当你的主线程终止时。

相关问题