【问题标题】:Will an infinite 'while loop' consume excessive resources无限的“while循环”会消耗过多的资源吗
【发布时间】:2016-12-03 17:45:45
【问题描述】:

我想在特定时间触发 Java 代码,比如说每天早上 1 点。

我写了一个线程如下:

while (true) {
    if (currentTime = 1AM) {
        doSomething;
    }       
}

我有点担心,while loop继续运行,它会减慢机器速度,还是占用处理资源?

我的第一个问题是,我在想如果我每秒只循环 1 次,会更好吗?

while (true) {
    if (currentTime = 1AM) {
        doSomething;
    }       

    Thread.sleep(1000);
}

我的第二个问题是,有时我看到 while loop 写成如下,大部分时间都是为了获取 Java 锁,谁能解释如果我们写 while loop 有多贵 如下(抱歉,如果这是非常基本的问题)?

while (isLock) {
    // do nothing
}

doThisIfNoLock();

我扩展上面的思路,如果我创建一个空线程,里面有一个无限的空while loop,线程实际占用了多少资源(处理能力)?因为循环里面没有内容,按照我的想象,循环会跑得很快,最终会占用很多CPU周期?这是真的吗?

【问题讨论】:

  • 有调度器来做这些事情。看看石英调度器。如果您使用的是 Spring,则可以安排此类事情。你的方法很糟糕
  • 即使java.util.Timer 也比您尝试的要好。
  • 你不能运行无限的while循环。它会消耗资源并减慢处理速度。请改用调度程序。

标签: java loops while-loop infinite-loop


【解决方案1】:

运行无限while循环不是一个好习惯,因为它会占用CPU。

对于计划任务,您可以使用 Quartz 等库或使用 java.util.Timerjava.util.TimerTask

您的任务需要从TimerTask 继承并覆盖run() 方法。 然后你需要使用Time.schedule() 方法来安排你的任务。

【讨论】:

    【解决方案2】:

    Thread.sleep 可以在这种情况下使用,但是更好的选择是使用与此类似的计时器

    long current = System.currentTimeMillis();   
    while(current < expectedElapsedTime){
        current = System.currentTimeMillis();
        //logic goes here
    } 
    

    在没有某种计时器来减慢循环速度的情况下运行无限循环会像吸尘器一样吸走计算机中的所有资源。另一种安排任务的方法是使用摆动计时器

    ActionListener listener = new ActionListener(){
    public void actionPerformed(ActionEvent event){
        checkUser = true;
      }
    };
    Timer checkUserTimer = new Timer(5000, listener); // 5 second pause
    checkUserTimer.start(); // start the timer.
    

    【讨论】:

      猜你喜欢
      • 2012-11-20
      • 1970-01-01
      • 2012-11-11
      • 2012-09-25
      • 2012-07-20
      • 2011-12-15
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      相关资源
      最近更新 更多