gpt4 book ai didi

java - 用Java制作一个简单的计时器

转载 作者:搜寻专家 更新时间:2023-11-01 01:01:14 29 4
gpt4 key购买 nike

我似乎无法弄清楚如何在 java 中制作一个简单的计时器。我需要它做的只是显示时间,真的。所以只是一个开始方法,它会像 0:00、0:01、0:02 等一样不断计数。我看过其他一些类似的论坛帖子,但所有代码对于我的水平来说都有些复杂理解;我对java有点陌生。但是制作一个只执行这种基本功能的定时器应该不难吧?如果有人可以提供帮助,将不胜感激:)

最佳答案

这并不困难。但是,我要提醒您的是,我已经看到了一些关于堆栈溢出的非常困惑的答案,在某些情况下,编码习惯非常糟糕,所以要非常小心。首先让我回答这个问题。

如果程序员在实现计时器时犯的最大错误似乎是认为他们需要一些东西来跟踪当前时间。也就是说,他们编写了某种循环,每秒增加一个变量或一些愚蠢的事情。您无需编写代码来跟踪时间。函数System.currentTimeMillis()会为你做到这一点,而且它做得非常准确。

定时器代码会涉及到很多程序员混淆的两个方面:

  • 时间计算
  • 刷新显示

  • 计算显示时间所需要做的就是记录计时器启动的时间:
    long startTime = System.currentTimeMillis();

    稍后,当您想要显示时间量时,只需从当前时间中减去它即可。
    long elapsedTime = System.currentTimeMillis() - startTime;
    long elapsedSeconds = elapsedTime / 1000;
    long secondsDisplay = elapsedSeconds % 60;
    long elapsedMinutes = elapsedSeconds / 60;
    //put here code to format and display the values

    程序员犯的最大错误是认为他们需要一个变量来保存当前时间,然后编写代码以每秒递增该变量,例如他们维护的称为“elapsedSeconds”的东西。问题是您可以安排代码每秒调用一次,但不能保证该代码将在何时被调用。如果系统很忙,该代码可能会比第二次调用晚很多。如果系统非常繁忙(例如从故障磁盘获取页面),它实际上可能会延迟几秒钟。使用 Thread.sleep(1000) 函数每秒循环的代码会发现错误随着时间的推移而累积。如果 sleep 一次返回 300 毫秒,则该错误会复杂到您对时间的计算中。这完全没有必要,因为操作系统具有告诉您当前时间的功能。

    无论您每秒运行此代码、每秒运行 100 次还是每 3.572 秒一次,上述计算都是准确的。重点是 currentTimeMillis()无论何时调用此代码,都是时间的准确表示——这是一个重要的考虑因素,因为不能保证线程和计时器事件在特定时间是准确的。

    计时器的第二个方面是刷新显示。这将取决于您用于显示的技术。在 GUI 环境中,您需要安排绘制事件。您希望这些绘制事件在预期显示更改的时间之后立即发生。然而,这很棘手。您可以请求绘制事件,但可能有数百个其他绘制事件在您之前排队等待处理。

    一种懒惰的方法是每秒安排 10 个绘制事件。因为时间的计算不依赖于在特定时间点被调用的代码,而且因为如果你用相同的时间重新绘制屏幕也没有关系,这种方法或多或少保证了显示的时间在大约 1/10 秒内显示正确的时间。这似乎有点浪费,因为 10 次中有 9 次您正在绘制屏幕上已有的内容。

    如果您正在编写一个带有某种动画(如游戏)的程序,该程序每秒刷新屏幕 30 次,那么您什么都不用做。只需将计时器显示调用合并到您的常规屏幕刷新中即可。

    如果绘制事件很昂贵,或者如果您正在编写一个执行终端样式输出的程序,您可以通过计算显示更改前剩余的时间量来优化事件的调度:
    long elapsedTime = System.currentTimeMillis() - startTime;
    long timeTillNextDisplayChange = 1000 - (elapsedTime % 1000);

    变量 timeTillNextDisplayChange 保存您需要等待的毫秒数,直到计时器的秒数部分发生变化。然后你可以安排一个绘制事件在那个时候发生,可能调用 Thread.sleep(timeTillNextDisplayChange)并在 sleep 后进行输出。如果您的代码在浏览器中运行,您可以使用此技术在正确的时间更新页面 DOM。

    请注意,此显示刷新计算中没有任何内容会影响计时器本身的准确性。线程可能会延迟 10 毫秒,甚至延迟 500 毫秒从 sleep 返回,并且不会影响计时器的准确性。每次通过时,我们都会根据 currentTimeMillis 计算等待时间,因此一次被延迟调用不会导致后面的显示延迟。

    这是准确计时器的关键。不要期望操作系统在您要求时调用您的例程或发送绘制事件。通常,当然,对于现代机器,操作系统的响应速度非常快且准确。这发生在测试情况下,您没有运行太多其他东西,并且计时器似乎可以正常工作。但是,在生产中,在罕见的压力情况下,您不希望您的计时器“漂移”,因为系统很忙。

    关于java - 用Java制作一个简单的计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10820033/

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