我为我的系统创建了一个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秒继续打印一次,而是等待很长时间才能进行下一次打印。
为什么?
答案 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小时或+
的情况下运行这是我发现的最佳解决方案。 问题解决了