无限的“while循环”会消耗过多的资源

时间:2016-07-29 06:01:35

标签: java loops while-loop infinite-loop

我想在特定的时间触发Java代码,比方说每天凌晨1点。

我写了一个如下的帖子:

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

我有点担心, while loop 继续运行,它会降低机器速度,还是会耗尽处理资源?

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

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

    Thread.sleep(1000);
}

我的第二个问题是,有一段时间我看到 while loop 编写如下,大部分时间来获取Java锁定,任何人都可以解释如果我们编写 {会有多贵{1}} 如下(抱歉,这是非常基本的问题)?

while loop

我扩展了上面的想法,如果我创建一个空线程,并且内部有一个无限空 while (isLock) { // do nothing } doThisIfNoLock(); ,那么线程实际占用了多少资源(处理能力)?因为循环中没有内容,根据我的想象,循环将运行得非常快,最终需要多次CPU功率循环?这是真的吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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.