java定时任务

java定时任务,java,timer,Java,Timer,在以下情况下会发生什么 Timer t = new Timer(); t.schedule(...); t = new Timer(); 具体来说,在我将新的Timer实例分配给t之后,我在Timer t上计划的任务会发生什么情况?它将毫无问题地运行。唯一的问题是,如果你不能取消第一个计时器(如果你真的想取消它)它们不会消失。每个计时器对象都与后台进程相关联。即使在程序中删除对计时器的所有引用,后台进程仍将继续运行(它保存自己对对象的引用)。因此,对象将不会接受垃圾收集 有关详细信息,请参阅

在以下情况下会发生什么

Timer t = new Timer();
t.schedule(...);
t = new Timer();

具体来说,在我将新的Timer实例分配给t之后,我在Timer t上计划的任务会发生什么情况?

它将毫无问题地运行。唯一的问题是,如果你不能取消第一个计时器(如果你真的想取消它)

它们不会消失。每个
计时器
对象都与后台进程相关联。即使在程序中删除对
计时器的所有引用,后台进程仍将继续运行(它保存自己对对象的引用)。因此,对象将不会接受垃圾收集

有关详细信息,请参阅

与每个计时器对象对应的是一个后台线程,用于按顺序执行计时器的所有任务。。。在对计时器对象的最后一个实时引用消失并且所有未完成的任务都已完成执行后,计时器的任务执行线程将正常终止(并成为垃圾收集的对象)。但是,这可能需要任意长的时间

这让我相信,丢失对计时器的引用根本不会影响它。看来任何预定的任务都肯定会被执行。无法收集计时器实例,并且在使用该计时器计划的最后一个任务完成执行之前,应用程序无法关闭。文件摘录:

“当对计时器对象的最后一次实时引用消失并且所有未完成的任务都已完成执行后,计时器的任务执行线程将正常终止(并接受垃圾收集)。但是,这可能需要任意长的时间。默认情况下,任务执行线程不作为守护进程线程运行,因此它能够阻止应用程序终止。如果调用方希望快速终止计时器的任务执行线程,则调用方应调用计时器的取消方法。“

例如

private ScheduledExecutorService scheduler;
private AccurateScheduledRunnable periodic;
private ScheduledFuture<?> periodicMonitor;
private int taskPeriod = 30;
private SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
private SimpleDateFormat sdfHour = new SimpleDateFormat("HH");
监控

abstract class AccurateScheduledRunnable implements Runnable {

    private ScheduledFuture<?> thisThreadsMonitor;

    public void setThreadMonitor(ScheduledFuture<?> monitor) {
        this.thisThreadsMonitor = monitor;
    }

    protected long getExecutionTime() {
        long delay = -1 * thisThreadsMonitor.getDelay(TimeUnit.MILLISECONDS);
        return delay;
    }
}
抽象类AccurateScheduledRunnable实现可运行{
私有计划未来此线程监视器;
公共无效设置线程监视器(ScheduledFuture监视器){
this.thisThreadsMonitor=监视器;
}
受保护的长getExecutionTime(){
long delay=-1*thisThreadsMonitor.getDelay(时间单位:毫秒);
返回延迟;
}
}

这取决于您计划使用哪个Timer.schedule(..)方法。如果将计时器设置为重复执行,则将新的计时器实例分配给t不会导致垃圾收集,因为计时器线程将保持活动状态。如果将计时器设置为一次性执行,则对象将被垃圾收集。至少文档中是这么说的。

后台进程的名称?
long she = periodicMonitor.getDelay(TimeUnit.SECONDS);
abstract class AccurateScheduledRunnable implements Runnable {

    private ScheduledFuture<?> thisThreadsMonitor;

    public void setThreadMonitor(ScheduledFuture<?> monitor) {
        this.thisThreadsMonitor = monitor;
    }

    protected long getExecutionTime() {
        long delay = -1 * thisThreadsMonitor.getDelay(TimeUnit.MILLISECONDS);
        return delay;
    }
}