gpt4 book ai didi

java - 使用循环在新线程中运行我的程序 - 不使用 sleep ?

转载 作者:行者123 更新时间:2023-12-02 01:18:49 37 4
gpt4 key购买 nike

我只有一个程序,用于在它自己的线程中执行此操作:

public void run(){
long lastTime = System.nanoTime();
float lastSleep = 0;
//Everything is in seconds.
while(running){
float delta = (System.nanoTime()-lastTime)/1000000000f;
lastTime = System.nanoTime();
manager.update(delta);
panel.repaint();
lastSleep = Math.max(maxTicSpeed-(delta-lastSleep),5/1000f);
try{
Thread.sleep((long) Math.round(lastSleep*1000));
}catch(InterruptedException e){
e.printStackTrace();
}
}
}

基本上我一直被教导在像这样循环时要 sleep ,所以我这样做了,我的程序 sleep 至少5毫秒,或者它可以在不超过限制的情况下 sleep 的最长时间(1/30秒)。但我到处看书, sleep 听起来不太好。

http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx

从他的说法来看,如果我的程序太接近 sleep 下限等,它甚至不会 sleep 。当 system.printing 及时更改时,更改范围约为 0.31508 - 0.03475,这对我来说确实足够好了,因为我的程序会导致不准确。

话虽这么说,我能做什么呢?我正在考虑添加这样的东西而不是 try{Sleep}:

long waitTill = (long) (System.nanoTime()+lastTime/1000000000f), 
now = System.nanoTime();
while(now < waitTill){
now = System.nanoTime();
}

但是我的线程不会仍然占用相同数量的处理器时间吗?我认为重点是阻止我们的线程占用比实际需要更多的处理器。

那么,我应该使用 sleep(具有更大的最小 sleep 时间吗?),我应该使用我的替代方案,我应该使用另一个替代方案,还是应该让我的程序以不受限制的速度循环?即使我考虑了 sleep 不准确,我的编程是否也很糟糕?

感谢您的帮助!

编辑:因此,已推荐计时器,但是我知道,如果我的任务在计时器再次调用之前没有完成,那么我会遇到问题。这绝对是我的计划所关心的问题。我觉得我已经通过使用delta处理了Thread.sleep()的问题,那么,像以前那样的Thread.sleep()会更好吗?

最佳答案

为了解决此问题,您需要重新考虑您的设计。本质上,您所做的就是按定期安排的时间间隔进行工作。运行/同时/ sleep 模式有效,但正如您的研究发现,这并不是最佳解决方案。

现代语言具有“任务运行”模式,允许编程环境/操作系统更好地管理任务的执行。

在Java中有java.util.timer以及java.util.timertask 。使用任务运行模式,您可以创建任务,并安排它以特定的时间间隔运行。

计时器还为您提供了一种更简洁的方法来停止执行循环,即取消计时器,而不是设置 boolean 标志。

来自评论:

有几个问题需要注意。如果您的任务的运行时间可能比计划的时间间隔长,则可能会在上一个任务仍在执行的同时运行另一个任务。一些解决方案:

  1. 使用作业队列对要完成的工作进行排队。如果队列中没有工作,任务将返回。
  2. JavaScript 中常见的另一种方法是安排任务执行一次,并在任务结束时重新安排该任务执行一次。
  3. 一种不太优雅的方法,使用标志来指示正在执行的特定任务。这可行,但需要您正确管理标志的状态,这很容易出错。

另一个常见问题是计划的计时器通常是尽力实现的。也就是说,操作系统/框架尝试按计划运行任务,但不保证任务将严格按照指定的时间间隔执行。因此,如果您的任务需要严格的、确定性的调度,您可能需要一个更接近操作系统/硬件的解决方案。

关于java - 使用循环在新线程中运行我的程序 - 不使用 sleep ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17266135/

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