gpt4 book ai didi

java - 使用 Thread.sleep() 限制的循环运行频率是预期的两倍多

转载 作者:行者123 更新时间:2023-12-01 12:38:50 26 4
gpt4 key购买 nike

我使用以下循环(删掉一些内容)作为游戏的主循环,但我无法让它降低到我想要的速度,它的运行速度大约是我预期的两倍.

private void myLoop() throws InterruptedException {

long timer = TimeUtils.getMillis();

int achievedLoops = 0;

long currTime = 0l;
long loopTime = 0l;
long lastTime = TimeUtils.getNano();

while(!isRequestedToStop) {
currTime = TimeUtils.getNano();
loopTime = currTime - lastTime;
lastTime = currTime;

if(TimeUtils.getDeltaMillis(timer) > 1000) {
timer += 1000;
logger.debug(achievedLoops + " Loops");
achievedLoops = 0;
}

achievedLoops++;

if(loopTime < TIME_PER_LOOP) {
Thread.sleep( (TIME_PER_LOOP - loopTime) / 1000000l);
}
}
}

sleep 的替代实现,获得稍微更好的结果(循环运行频率仅 1.9 次):

while(loopTime < TIME_PER_LOOP) {
Thread.sleep(1l);
loopTime += 1000000l;
}

另一种选择:

while(loopTime < TIME_PER_LOOP) {
Thread.sleep(1l);
loopTime = TimeUtils.getNano() - lastTime;
}

为什么会发生这种情况?
还有其他方法可以限制线程吗?

我基本上可以不受控制地运行它,因为逻辑与定时步骤相关,但我想减少循环的总运行次数,否则它有可能损坏 CPU。

最佳答案

LockSupport可以在指定的纳秒内禁用线程的调度。

LockSupport.parkNanos(TIME_PER_LOOP - loopTime);

但正如其他人提到的,有更好的方法来控制时序(例如 ScheduledExecutorService)。

关于java - 使用 Thread.sleep() 限制的循环运行频率是预期的两倍多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25316444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com