启动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
相关产品推荐
相关产品推荐

