当前位置: 首页 > 知识库问答 >
问题:

如何在java中每秒运行60次代码

卫甫
2023-03-14

如果我不控制代码每秒执行的次数,当我添加一行时,程序会发生变化,我必须再次调整常量。(谷歌翻译)我的代码失控了:

public builder(){
    while(true)
        stepEvent();
}
private void stepEvent() {
    setOfActions();
    repaint();
}

共有3个答案

方奕
2023-03-14

基本上,您必须每隔17毫秒执行stepCase

假设您希望按顺序运行,可以使用Thread在定义的时间段内停止执行。睡眠(毫秒,纳米)。在这种情况下,我们将停止线程17ms减去stepEvent执行时间(考虑添加条件以避免sleep函数中出现负值)

long startedTime;
for(;;){
    startedTime = System.currentTimeMillis(); 
    stepEvent();
    Thread.sleep(17 - System.currentTimeMillis() + startedTime);
}

否则,您可以使用schduledExecutorService,它允许您安排代码以固定的时间间隔(或指定的延迟后)定期运行。在这种情况下,您可以每17ms以固定的速率执行一步。

ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleAtFixedRate(YourClass::stepEvent, 0, 17, TimeUnit.MILLISECONDS);

您还可以配置为对执行器使用多个线程。newScheduledThreadPool

督瑞
2023-03-14
import java.util.Timer;
import java.util.TimerTask;

public class HelloWorld {
    public static void main(String []args) {
        // number of ms in 1/60 of a second
        // there will be some rounding error here,
        // not sure if that's acceptable for your use case
        int ms = 1000 / 60;
        Timer timer = new Timer();
        timer.schedule(new SayHello(), 0, ms);
     }
}

class SayHello extends TimerTask {
    public void run() {
       System.out.println("Hello World!"); 
    }
}
太叔景曜
2023-03-14

这只是一种方法(非常长但非常精确——我建议用于游戏开发)。在本例中,我使用Runnable接口中的run()方法来执行代码。

public void run(){
    long lastTime = System.nanoTime();
    final double ns = 1000000000.0 / 60.0;
    double delta = 0;
    while(true){
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;
        while(delta >= 1){
            the code you want to be executed 
            delta--;
            }
        } 
   }

逐行解释:

基本上,我将当前时间以纳秒为单位存储在lastTime中。然后在ns中,我以纳秒为单位存储1/60秒,并创建一个变量delta

在这之后,我进入无限while循环(它不一定是无限的)并再次将当前时间以纳秒为单位存储在now中。这是为了考虑计算机从lastTime声明行到while循环行所花费的时间。

在做了所有这些之后,我把nowlastTime的差除以我提到的1/60秒(ns)。这意味着每次delta等于1时,就会经过1/60秒。

在这之后,我把上次的改成现在的。在随后的while循环中,我检查delta是否等于或大于1,然后你应该把所有你想要每秒执行60次的代码放入其中。不要忘记从delta中减去1,这样它就不会无限循环。

彻底分析代码,看看你是否能理解它。如果你不能,我会进一步澄清。我坚持认为这只是一种可能的方法,但还有更多的方法。

注意:在某些情况下,您甚至永远不需要delta,但它对于某些目的非常有帮助。

代码的功劳:大部分代码(至少在我得到它的地方

祝你有美好的一天!

 类似资料:
  • 问题内容: 使用它可以在指定的时间启动功能: 但是,如果我想多次启动该功能怎么办?每次经过一个时间间隔,我都想执行该功能(假设每60秒执行一次)。 问题答案: 如果您不在乎内的代码是否可能花费比您的间隔更长的时间,请使用: 一遍又一遍地触发作为第一个参数传入的函数。 更好的方法是与函数一起使用: 这样可以保证在执行代码之前不会进行下一个调用。在本示例中,我将其用作函数参考。这是给函数命名并在其中调

  • 问题内容: 我想做的是检索一个PHP文件的内容,并每60秒将它插入一个div中,基本上刷新了动态div。到目前为止,我已经提出了以下代码,但是它似乎没有用。代码就是这样,除了MYSQL登录外,没有什么额外的。 PHP抢: 原始的PHP代码是相同的,包含在div中,其id属性为’ajax_table’。 JavaScript是: 那是在请求另一个php页面的页面上。 问题答案: 如何使用类似jQue

  • 我的应用程序的一个核心功能是它有一个持续的通知和一个每分钟更新的倒计时--即使应用程序被Android操作系统关闭。 首先,我使用一个服务来运行计时器并更新通知,但这是一个内存/电池占用。因此,我转而使用来完成计时器和重复警报,每60秒左右唤醒一次以更新通知: 什么是一种好方法来确保正在进行的通知至少每60秒更新一次呢?除了回到使用一个服务(啊!加上操作系统有时会在内存很少的设备上直接杀死服务)之

  • 问题内容: 我想每60秒在Python上执行一个函数,但是我不想同时被阻塞。 如何异步进行? 使用此代码,函数f在20秒time.time中每3秒执行一次。最后,它给出了一个错误,我认为这是因为threading.timer尚未被取消。 如何取消呢? 提前致谢! 问题答案: 您可以尝试threading.Timer类:http : //docs.python.org/library/threadi

  • 问题内容: 抱歉,我有点菜鸟,我只想知道我如何让此javascript每秒钟运行一次? 源代码: 问题答案: 使用setInterval()每x毫秒运行一段代码。 您可以将要每秒运行的代码包装到一个名为的函数中。 因此它将是: 要停止它,可以运行:

  • 问题内容: 我想编写一个Java while循环,该循环将迭代15秒。我认为要执行此操作的一种方法是存储当前系统时间+ 15秒,然后将其与while循环签名中的当前时间进行比较。 有没有更好的办法? 问题答案: 此设计取决于您15秒钟要做什么。两种最合理的情况是“每X进行15秒钟”或“等待X发生或15秒钟以较早者为准”,这将导致截然不同的代码。 刚等 线程睡眠(15000) 这不会重复,但是如果您