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

5
我希望在特定的时间触发Java代码,比如每天早上1点。我编写了以下线程:
while (true) {
    if (currentTime = 1AM) {
        doSomething;
    }       
}

我有点担心,while循环一直在运行,会不会减慢计算机速度或占用处理资源?

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

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

    Thread.sleep(1000);
}

我的第二个问题是,有时我看到像下面这样写的while循环,大多数情况下是为了获取Java锁,请问如果我们像下面这样写while循环,会有多么昂贵的代价(如果这是一个非常基础的问题,请原谅)?
while (isLock) {
    // do nothing
}

doThisIfNoLock();

我扩展一下上面的想法,如果我创建一个空线程,并在其中放置一个无限的空while loop,那么这个线程实际上会占用多少资源(处理能力)呢?因为循环内没有任何内容,根据我的想象,循环将非常快地运行,并最终占用许多CPU周期。这是真的吗?


有调度程序可以做这样的事情。看看Quartz Scheduler。如果你正在使用Spring,你可以安排这样的事情。你的方法不好。 - TheLostMind
即使是java.util.Timer也比你所尝试的更好。 - Mad Physicist
你不能运行无限的while循环。它会消耗资源并减慢处理速度。请使用调度程序。 - Rish
1
https://dev59.com/Bmox5IYBdhLWcg3wLhei - Lijo
2个回答

5

在编程中,不建议使用无限制的 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
} 

如果没有一些计时器来减速循环,无限循环将像吸尘器一样耗尽计算机的所有资源。你可以使用Swing计时器来安排任务。

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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接