gpt4 book ai didi

java - while(true) 循环或标准程序循环的 java.util.Timer?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:37 25 4
gpt4 key购买 nike

最近我做了一个非常基础的程序。具有暂停能力的时间计数器。它使用 3 个线程,2 个用于 Swing,1 个用于主线程。

对于这个程序,主线程中应该有一个增量时间计数部分。我做了一个非常基本的系统;

while(true)
{
long now = System.currentTimeMillis();

if(!sessionPaused)
{
if(now-programLastMs>1000)
{
save();
programLastMs = now;
}
sessionMs += now-sessionPrevMs;
overallMs += now-sessionPrevMs;

sessionPrevMs = now;
sessionLabel.setText(formatMillis("This Session:<br/>",sessionMs));
overallLabel.setText(formatMillis("Overall:<br/>", overallMs));
}
}

上述代码导致 CPU 使用率过高。然后我将该代码块替换为:

timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {

long now = System.currentTimeMillis();

if(!sessionPaused)
{
if(now-programLastMs>1000)
{
save();
programLastMs = now;
}

sessionMs += now-sessionPrevMs;
overallMs += now-sessionPrevMs;

sessionPrevMs = now;

sessionLabel.setText(formatMillis("This Session:<br/>",sessionMs));
overallLabel.setText(formatMillis("Overall:<br/>", overallMs));
}
}
}, 0, 1);

问题就解决了。我只是想知道这是为什么。另外,创建程序循环的最佳方式是什么?

最佳答案

您的第一个代码块基本上以 CPU 的速度运行。要理解这一点,您需要知道什么 IPSFLOPS是。现代 CPU 执行几个 GFLOPS,这意味着您的第一个 block 每秒执行数万次甚至数十万次,具体取决于您的硬件。如果你在主线程上运行它,它会阻塞你的 UI(即你的 GUI 会卡住)。在一个单独的线程上,它会不断运行占用资源,实际上并没有做太多事情。

另一方面,第二个 block 具有每毫秒执行一次的特定指令。这意味着您的代码块被执行了 1000 次,其余的 CPU 时间被释放用于其他工作。

要解决您评论中的问题:使用无限循环几乎是 Not Acceptable 。循环最好用于一组指令的有界重复。在您的示例中,您似乎想每 1000 毫秒调用一次保存并计算 session 时间。我愿意

  1. 将保存分离到每 1000 毫秒调用一次的重复计时器。
  2. 创建一个 onSessionPause 和 onSessionResume,只有当暂停状态改变时。这可能是由于暂停按钮或您定义的其他某种条件造成的。 onSessionPause 和 onSessionResume 函数应该能够记录它们被调用的时间,并根据时间差更新 sessionMs。

除非您期望事情每毫秒都发生变化,否则您就是在让 CPU 做不必要的工作。

关于java - while(true) 循环或标准程序循环的 java.util.Timer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37066084/

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