【问题标题】:Run code every X seconds (Java)每 X 秒运行一次代码 (Java)
【发布时间】:2015-03-17 22:09:19
【问题描述】:

这不是超级必要的,我只是想看看其他人的想法。我知道这没用,只是为了好玩。

现在我知道如何做到这一点,它相当简单。我只是想找出一种不同的方法来做到这一点,它不需要创建新的变量来挤满我的班级。

我会这样做:

float timePassed = 0f;
public void update(){
    timePassed += deltatime;//Deltatime is just a variable that represents the time passed from one update to another in seconds (it is a float)
    if(timePassed >= 5){
        //code to be ran every 5 seconds
        timePassed -= 5f;
    }
}

我想知道的是,是否有办法在没有时间传递变量的情况下做到这一点。我有一个 statetime(自循环开始以来的时间)变量,可用于其他可用于此目的的事情。

【问题讨论】:

  • 是 Spring 框架选项吗?
  • 我只想要 Java 中的东西。请不要使用 API。必须有某种数学解决方案。
  • 这是你想要的吗? stackoverflow.com/questions/4544197/…
  • 是的,它谈到了适用于我的程序的 ScheduledExecutorService。我只是在等着看是否有人有一个数学解决方案,不需要在运行另一个线程的情况下运行侦听器。尽量避免延迟,因为这是针对服务器/客户端应用程序的。

标签: java timer intervals


【解决方案1】:

如果目标真的是每 X 秒运行一次代码,我的第一选择是使用 util.Timer。另一种选择是使用 ScheduledExecutorService,它在 util.Timer 上添加了一些增强功能(一个更好的异常处理)。

我倾向于避免使用 Swing.Timer,因为我更喜欢让 EDT(事件调度线程)保持整洁。

很多人写了一个“游戏循环”,它更接近于你已经开始的内容。搜索“游戏循环”可能会找到几种变体,具体取决于您是否希望保持稳定的速度。

有时,在不想连续测试和重置的情况下,可以通过使用“AND”操作来组合这两个功能。例如,如果您将 63 与一个整数相乘,则可以在 0-63 范围内进行迭代。这适用于 2 的幂的范围。

根据调用代码的结构,您可能会将“statetime”变量作为参数传入并测试它是否大于您想要的 X。如果您这样做,我假设调用代码中的一个步骤将将“statetime”重置为零。

另一个想法是将“startTime”传递给更新方法。然后,您的计时器将测试 currentTimeMillis 和 startTime 之间的差异,以查看 X 秒是否已过。同样,您调用的代码可能应该设置一个新的“startTime”作为该过程的一部分。这种方法的好处是不需要增加经过的时间。

只要我提出想法:也可以创建一个未来的“targetTime”变量并测试 currentTimeMillis() - targetTime > 0。

startTime 或 targetTime 可以是不可变的,这通常会带来一点好处,具体取决于它们的使用方式。

【讨论】:

  • 感谢您的回复!我会使用 ScheduledExecutorService。我在网上阅读了一些关于它的信息,看起来确实可以很好地工作。我真的没有重置状态时间的计划(我用它来计算精灵动画帧)。如果有人有一个很棒的数学解决方案,如果没有,我会接受这个作为答案。我宁愿避免使用 ScheduledExecutorService,但如果这是最好的方法,我会这样做。
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 2011-01-03
相关资源
最近更新 更多