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

启动TimerTask后结束再重启报java.lang.IllegalStateException的原因?

关于TimerTask重复启动报错的原因与解决办法

嘿,这个问题我之前也踩过坑!你碰到的IllegalStateException: Task already scheduled or cancelled本质原因很明确:Java里的TimerTask是“一次性”的对象。

当一个TimerTask执行完成,或者被调用过cancel()方法后,它会被标记为「已完成/已取消」状态,再也不能被同一个Timer实例重新调度。从你的日志来看,应该是第一次任务执行结束后,你复用了同一个TimerTask对象去调用schedule方法,直接触发了这个异常。

给你几个实用的解决思路:

  • 每次启动任务都新建TimerTask实例
    别想着复用对象省资源,TimerTask本身非常轻量,每次执行前新建一个就好,示例代码如下:

    Timer macroTimer = new Timer();
    // 每次需要执行时,创建全新的任务对象
    macroTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            // 这里写你的MacroSK按键逻辑
            System.out.println("[MacroSK]: KEY_L");
        }
    }, 0); // 0表示立即执行,也可设置延迟时间
    
  • 用重复调度API替代手动重启
    如果你的任务需要重复执行,直接用Timer自带的重复调度方法就行,不用手动去重启任务。比如scheduleAtFixedRate或者带周期参数的schedule:

    Timer macroTimer = new Timer();
    // 初始延迟1秒,之后每5秒执行一次
    macroTimer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            // 你的任务逻辑
        }
    }, 1000, 5000);
    
  • 清理旧任务再启动新任务
    如果你必须手动控制任务的启停,要注意:每次重启前,先调用旧TimerTask的cancel(),然后新建一个TimerTask实例;如果之前的Timer已经被取消,也要同步新建Timer对象。

按照上面的方法调整,应该就能解决你遇到的问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:47:39