while(!isRunning){
now = getSystemTime();
deltaTime = now - lastTime;
lastTime = now;
if(deltaTime >= 1000){
//do something
}
}
这段代码看起来很尴尬。我希望线程能够做某事"每1000个单位的时间,但while循环将在1000个单位时间过去之前无限运行,这浪费了CPU的资源。你觉得我怎么能重构这段伪代码?请注意,"做某事"可能是真的。可能需要超过1000个单位的时间。 PS: 我正在使用java进行编码,并希望用Java解决问题。
答案 0 :(得分:1)
看看Java scheduled executors。您可以使用名为scheduleAtFixedRate的方法。有一个名为TimeUnit的类,在此方法中用于使某些时段运行。这样做的缺点是你必须创建一个Callable或Runnable的实例,这在我看来有点笨拙
答案 1 :(得分:0)
这里的问题是代码执行busy wait,意味着浪费CPU周期,直到delta
大于1秒。
最好只是简单地睡一会儿,并允许其他进程在您的进程无效的情况下利用CPU周期:
while(!isRunning){
doSomething();
sleep(1000); // see implementation below
}
...
void sleep(int milli) {
try {
Thread.sleep(milli);
} catch (InterruptedException e) {
// ignore
}
}
答案 2 :(得分:0)
首先,我会创建一个函数来跟踪时间,以便代码看起来更干净。其次,如果你在里面睡一觉,那么我们就不会在繁忙的等待中占用CPU时间。你可以有更多的定时部分和更多的计时器变量。
int countTime(int & time){
now = getSystemTime();
deltaTime = now - time;
lastTime = now;
return deltaTime
}
...
while(!isRunning){
if(countTime(timer) >= 1000){
//do something
}
usleep(100000) // sleep so we don't occupy CPU
}
答案 3 :(得分:0)
它会永远运行吗?背景是什么?
尝试这样做:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
final Runnable beeper = new Runnable() {
public void run() { algorithm something here! }
};
final ScheduledFuture<?> beeperHandle =
scheduler.scheduleAtFixedRate(beeper, 1000, 1000, TimeUnit.MILLISECONDS);
也许它可以解决你的问题!
如果您对上面发布的方法有疑问,请查看oracle文档: https://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html