You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中取消Timer定时器后,如何重新启动定时器?

如何在取消Java Timer后重新启动它

我使用Java的Timer定时器,点击按钮可以取消/停止定时器,现在希望点击启动按钮重新启动定时器。请问取消Timer后该如何重新启动它?

原启动代码:

timerLoop = new Timer();
hourlyTaskLoop = new TimerTask() {
    @Override
    public void run() {
        // 定时任务逻辑
    }
};

timerLoop.schedule(hourlyTaskLoop, 0l, 1000);

停止代码:

timerLoop.cancel();
hourlyTaskLoop.cancel();

核心结论

Java的Timer和TimerTask一旦调用cancel()后就无法复用:

  • Timer.cancel()会终止其内部的调度线程,这个Timer实例彻底失效,不能再用来调度任何任务
  • TimerTask.cancel()会将任务标记为已取消,即便换个Timer也无法再次调度这个任务

所以重新启动定时器的唯一办法是:重新创建新的Timer和TimerTask实例,然后执行调度

完整实现示例

可以把启动和停止逻辑封装成方法,每次启动都生成新实例:

private Timer timerLoop;
private TimerTask hourlyTaskLoop;

// 启动定时器
private void startTimer() {
    // 先停止已有定时器,避免重复启动
    stopTimer();
    
    // 创建全新的Timer和任务实例
    timerLoop = new Timer();
    hourlyTaskLoop = new TimerTask() {
        @Override
        public void run() {
            // 此处编写你的定时任务逻辑
            System.out.println("定时任务执行中...");
        }
    };
    
    // 调度任务:立即执行,每1秒重复一次
    timerLoop.schedule(hourlyTaskLoop, 0L, 1000);
}

// 停止定时器
private void stopTimer() {
    // 先取消任务
    if (hourlyTaskLoop != null) {
        hourlyTaskLoop.cancel();
        hourlyTaskLoop = null;
    }
    // 再取消Timer
    if (timerLoop != null) {
        timerLoop.cancel();
        timerLoop = null;
    }
}

注意事项

  1. 每次启动前先调用stopTimer(),防止多次点击启动按钮创建多个定时器,导致任务重复执行
  2. 置空实例引用,帮助JVM回收已失效的Timer和TimerTask资源

内容的提问来源于stack exchange,提问作者Josort

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:40:25