2016-07-29 198 views
3

我想在特定的时间触发一个Java代码,比方说每天早上1点。无限的'while循环'是否会消耗过多的资源

我写一个线程如下:

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功耗?真的吗?

+0

有调度程序可以执行此类操作。看看Quartz Scheduler。如果你使用Spring,你可以安排这样的事情。你的方法不好 – TheLostMind

+0

即使'java.util.Timer'也比你尝试的更好。 –

+0

你无法在while循环中运行无限..它会吸收资源并减慢处理速度。改用调度器。 – Rish

回答

4

它不是一个很好的做法来运行无限循环,因为它可以控制CPU。

计划任务,你可以使用库,例如​​石英或使用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.