定时器和定时任务 - 如何在定时任务运行中重新调度定时器

3

我想做的基本上是创建一个计时器,它可以在x秒后运行一个特定的TimerTask,但是TimerTask可以重新安排计时器在y秒后执行任务。下面是一个示例,它在我尝试在TimerTask中调度此任务的行上给出了错误“Exception in thread "Timer-0" java.lang.IllegalStateException:Task already scheduled or cancelled”。

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 = new Timer(); timer.schedule(this, seconds*200);因为你已经在构造函数中安排了任务,所以你会得到java.lang.IllegalStateException异常。删除这些行并重新运行。 - pardeep131085
1个回答

4

使用新的RemindTask替代现有的任务。

应该这样做:

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

替代

timer.schedule(this, seconds*200);

@Braj 如果它长时间执行,会导致内存泄漏吗? - noobEinstien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接