Java的定时器Java的定时器(Java Timer)

2019-05-13 18:33发布

我试图用一个定时器来安排应用程序中的一个经常性事件。 不过,我希望能够在这实时事件触发(根据用户输入)调整期。

例如:

public class HelperTimer extends TimerTask
{
    private Timer timer;
    //Default of 15 second between updates
    private int secondsToDelay = 15;

    public void setPeriod(int seconds)
    {
        this.secondsToDelay = seconds;
        long delay = 1000; // 1 second
        long period = 1000*secondsToDelay; // seconds
        if (timer != null) 
        {
            timer.cancel();
        }
        System.out.println(timer);
        timer = new Timer();
        System.out.println(timer);
        timer.schedule(this, delay, period);
    }
    public int getPeriod()
    {
        return this.secondsToDelay;
    }
}

然后我开始这个类的一个新实例,并调用其设定时间的功能。 然而,当我这样做,我得到一个非法状态异常。 你可以看到的System.out.println(定时器); 在那里,因为我正在检查,并没错果然,它们是两个不同的定时器...那么,为什么我会得到一个IllegalStateException当我尝试运行一个全新的Timer实例的时间表电话!?!?!?!

java.util.Timer@c55e36
java.util.Timer@9664a1
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Task already scheduled or cancelled
    at java.util.Timer.sched(Unknown Source)
    at java.util.Timer.schedule(Unknown Source)
    at HelperTimer.setPeriod(HelperTimer.java:38)

Answer 1:

因为你在这里做什么你不能重用一个TimerTask。

相关porition 定时器 :

private void sched(TimerTask task, long time, long period) {
    if (time < 0)
        throw new IllegalArgumentException("Illegal execution time.");

    synchronized(queue) {
        if (!thread.newTasksMayBeScheduled)
            throw new IllegalStateException("Timer already cancelled.");

        synchronized(task.lock) {
            //Right here's your problem.
            //  state is package-private, declared in TimerTask
            if (task.state != TimerTask.VIRGIN)
                throw new IllegalStateException(
                    "Task already scheduled or cancelled");
            task.nextExecutionTime = time;
            task.period = period;
            task.state = TimerTask.SCHEDULED;
        }

        queue.add(task);
        if (queue.getMin() == task)
            queue.notify();
    }
}

你需要重构你的代码,让你创建一个新的TimerTask,而不是重新使用一个。



Answer 2:

这似乎很奇怪,以我自己带有里面定时器一个TimerTask。 糟糕的设计。 我已经完全独立的两个有TimerTask的执行被移交给一个定时器,并把所有的逻辑关于与提供的接口这样做的另一个类中期内摆弄。 让那类实例化Timer和TimerTask并把他们关做好自己的工作。



Answer 3:

    import java.util.*;
    class TimeSetting 
    {
    public static void main(String[] args)
    {
    Timer t = new Timer();
    TimerTask time = new TimerTask()
    { 
    public void run()
    {
    System.out.println("Executed......");
    }
    };
    t.scheduleAtFixedRate(time, 4000, 3000); 
    // The task will be started after 4 secs and 
    // for every 3 seconds the task will be continuously executed.....
    }
    }


文章来源: Java Timer
标签: java timer