【问题标题】:Timer and TimerTask - how to reschedule Timer from within TimerTask runTimer 和 TimerTask - 如何在 TimerTask 运行中重新安排 Timer
【发布时间】:2014-07-28 17:41:13
【问题描述】:

基本上我想做的是制作一个在 x 秒后运行特定 TimerTask 的 Timer,但是 TimerTask 可以重新安排 Timer 在 y 秒后执行任务。示例如下,它给了我一个错误“线程“Timer-0”java.lang.IllegalStateException:任务已经安排或取消”,我尝试在 TimerTask 运行中安排此任务。

import java.util.Timer;
import java.util.TimerTask;

public class JavaReminder {

    public JavaReminder(int seconds) {
        Timer timer = new Timer();  
        timer.schedule(new RemindTask(timer, seconds), seconds*2000);
    }

    class RemindTask extends TimerTask {
        Timer timer;
        int seconds;
        RemindTask(Timer currentTimer, int sec){
            timer = currentTimer;
            seconds = sec;
        }

        @Override
        public void run() {
            System.out.println("ReminderTask is completed by Java timer");
            timer = new Timer(); 
            timer.schedule(this, seconds*200);
            System.out.println("scheduled");
        }
    }

    public static void main(String args[]) {
        System.out.println("Java timer is about to start");
        JavaReminder reminderBeep = new JavaReminder(2);
        System.out.println("Remindertask is scheduled with Java timer.");
    }
}

【问题讨论】:

  • 为什么你在run()方法中又写了同一行?计时器 = 新计时器(); timer.schedule(this, seconds*200);因为你已经在构造函数中安排了你的任务,所以你得到了 java.lang.IllegalStateException。删除这些行并再次运行。

标签: java multithreading timer timertask


【解决方案1】:

使用新的RemindTask 代替现有的。

应该是

timer.schedule(new RemindTask(timer, seconds), seconds*200);

而不是

timer.schedule(this, seconds*200);

【讨论】:

  • @Braj 如果执行时间长,会不会导致内存泄漏?
最近更新 更多