java:我应该在线程的 运行 方法中每秒调用一个方法 50x,仅使用方法睡眠(这里的所有其他线程都带有计时器)
java: I am supposed to call a method 50x per second in the run method of a thread, ONLY WITH THE METHOD SLEEP (All other threads here with timer)
我必须在一秒内调用一个线程的运行方法中的方法50次,问题是,我只允许使用sleep作为方法!
现在的问题是我该怎么做,例如这里的其他线程:
java- Calling a function at every interval
用计时器来做。
有了定时器就很简单了。但我只被允许使用睡眠作为一种方法...
while (true) {
long t0 = System.currentTimeMillis();
doSomething();
long t1 = System.currentTimeMillis();
Thread.sleep(20 - (t1-t0));
}
t1 减去 t0 是您在 'doSomething' 中花费的时间,因此您需要的睡眠时间远少于 20 毫秒。
您可能应该为 t1-t0 > 20 添加一些检查。
在基于 System.currentTimeMillis()(或基于任何其他系统时钟)的计时中,您无法避免 jitter。
此解决方案不会因抖动而累积错误(与此处测量任务在循环的每次迭代中实际花费的时间的另一个答案不同。)如果正确执行任务很重要,请使用此版本很长一段时间内的次数。
long dueDate = System.currentTimeMillis();
while (true) {
performThePeriodicTask();
dueDate = dueDate + TASK_PERIOD;
long sleepInterval = dueDate - System.currentTimeMillis();
if (sleepInteval > 0) {
Thread.sleep(sleepInterval);
}
}
我必须在一秒内调用一个线程的运行方法中的方法50次,问题是,我只允许使用sleep作为方法!
现在的问题是我该怎么做,例如这里的其他线程:
java- Calling a function at every interval
用计时器来做。
有了定时器就很简单了。但我只被允许使用睡眠作为一种方法...
while (true) {
long t0 = System.currentTimeMillis();
doSomething();
long t1 = System.currentTimeMillis();
Thread.sleep(20 - (t1-t0));
}
t1 减去 t0 是您在 'doSomething' 中花费的时间,因此您需要的睡眠时间远少于 20 毫秒。
您可能应该为 t1-t0 > 20 添加一些检查。
在基于 System.currentTimeMillis()(或基于任何其他系统时钟)的计时中,您无法避免 jitter。
此解决方案不会因抖动而累积错误(与此处测量任务在循环的每次迭代中实际花费的时间的另一个答案不同。)如果正确执行任务很重要,请使用此版本很长一段时间内的次数。
long dueDate = System.currentTimeMillis();
while (true) {
performThePeriodicTask();
dueDate = dueDate + TASK_PERIOD;
long sleepInterval = dueDate - System.currentTimeMillis();
if (sleepInteval > 0) {
Thread.sleep(sleepInterval);
}
}