每1秒重复一次定时器

时间:2014-12-10 22:03:00

标签: java timer

我为我的系统创建了一个Timer of Timer(java.util)。我希望每1秒执行一次。我试过这个:

public class GlobalManager extends Timer {

public static GlobalManager manager;
public static ConcurrentLinkedDeque<Manageable> datas = new ConcurrentLinkedDeque<>();

public GlobalManager() {
    Thread.currentThread().setName("GlobalManager");
    this.scheduleAtFixedRate(new TaskExecutor(), 0, 1000);

}

/* Manage the data in the waiting queue.. */
public static class TaskExecutor extends TimerTask {
    @Override
    public void run() {
        System.out.println(datas.size());
        for(Manageable data : datas) {
            if((System.currentTimeMillis() - data.startTime) >= data.delay) {
                data.run();

                if(data.removeAfterRun)
                    datas.remove(data);
            }
        }
    }
}

}

运行时出现问题。它每1秒打印出一条数据大小的行。 执行data.run()时,它不会每隔1秒继续打印一次,而是等待很长时间才能进行下一次打印。

为什么?

2 个答案:

答案 0 :(得分:0)

费用data.run多少钱?
计时器不是为处理大量同步工作而设计的,具有未定义的运行时间 您可以在计时器运行方法中启动'worker'线程。

以下示例显示内部运行时如何影响定期调用之间的时间。

package test.threads;

import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

public class TimerTest extends Timer {
    public static void main(String[] args) throws IOException {
        new TimerTest().startTimer();
    }

    private void startTimer() {
        this.scheduleAtFixedRate(new TaskExecutor(), 0, 1000);
    }

    public static class TaskExecutor extends TimerTask {
        @Override
        public void run() {
            try {
                Thread.sleep(2000);//<-- Increases the rate to at least 2 seconds
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(System.currentTimeMillis());
        }
    }
}

答案 1 :(得分:0)

感谢您的回答,但我看到了,我无法使用此解决方案,因为我需要每隔1秒检查一次我的所有数据来计算启动时间,所​​以我查找了Executor并使用了两个全局变量,一个使用Executer.schedulerThreadPool(5);和newSingleThreadExecutor 并且它们在11小时或+

的情况下运行

这是我发现的最佳解决方案。 问题解决了