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; } }
注意事项
- 每次启动前先调用
stopTimer(),防止多次点击启动按钮创建多个定时器,导致任务重复执行 - 置空实例引用,帮助JVM回收已失效的Timer和TimerTask资源
内容的提问来源于stack exchange,提问作者Josort
相关产品推荐
相关产品推荐

