【问题标题】:Problems with infinite for loop无限for循环的问题
【发布时间】:2023-03-31 11:00:01
【问题描述】:

我是 Java 编程专家……我正在编写调度程序。我正在从属性文件中读取日期和时间值。如果属性文件有任何更改,那么我必须重新安排调度程序。所以为此我正在编写一个无限循环,如图所示:

for(;;){
    result = loadData.checkChanges();
    if(result == true){
        //If changes found in the properties file then reSchedule tasks
        reSchedule();
    }
}

如果循环一直运行到“应用服务器”中的应用程序生命周期(一年或两年),它会遇到任何性能问题或 JVM 问题还是有其他问题?

【问题讨论】:

  • 在我看来while(true)for(;;) 更容易理解。
  • 我认为reSchedule()checkChanges() 的内容会真正决定这一点。
  • 鉴于您是拥有代码的人,您问我们是否有任何问题似乎很不公平。你有没有发现任何问题?

标签: java performance uptime


【解决方案1】:

除非您的checkChanges() 方法休眠或阻塞,否则当前编写的代码将通过调用loadData.checkChanges(); 尽可能快地处理CPU。理想情况下,您应该执行类似调用loadData.wait() 的操作,然后在您希望运行检查时让另一个线程调用loadData.notify()。一个更简单且几乎同样好的解决方案是定期休眠线程,例如:

for(;;){
    result = loadData.checkChanges();
    if(result == true){
        //If changes found in the properties file then reSchedule tasks
        reSchedule();
    }
    try {
        Thread.sleep(100);
    }
    catch (InterruptedException ignored) {}
}

另外,请不要使用for(;;)。而是尝试while(true),它更清晰。或者更好的是,尝试while(!stop),其中stop 是一个布尔变量,当您的应用程序上下文被破坏(服务器关闭、webapp 取消部署等)时,它被设置为true。

【讨论】:

  • for(;;) 是一种风格选择。这是我个人对无限循环(以及任何其他具有非标准退出点的循环)的偏好,并且被阅读为“永远”。有些人甚至使用预处理器用语言编写#define ever ;;,然后使用for (ever)
  • @Mark - 这是一种让许多人感到困惑的风格选择,并且具有几乎同样简洁的更清晰的替代方案。 “for(;;) 做什么?”的问题经常出现在 SO 上,但我认为我从未见过类似的“while(true) 做什么?”发布。
  • @aroth :需要提问的人不适合成为程序员。尽管可以说有一些在风格上更好的方法来做到这一点,但它是一种被广泛采用的做法,已经使用了 40 多年。上面提出和回答的许多问题表明,提问者无法使用搜索引擎、阅读书籍或以其他方式独立锻炼,但这些都是成为优秀开发人员的要求。
  • @mattnz:那些编写混淆代码的人没有立即明确地预先说明它所做的事情,也不适合成为现实世界中的程序员(那是其他人所在的世界)必须阅读你的手指排便的东西)。
  • @aroth @JUST。我所说的只是 for(;;) 的使用如此广泛,它已经超越了我们都非常鄙视的“混淆代码”这一点,而且还有比谁的着装意识更好的问题更重要的问题。
【解决方案2】:

这将是一个巨大的 cpu hogger,因为它正在运行一个无限循环,没有任何轮询或等待机制。最好使用 java Executor API 来完成这种工作:http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executor.html

【讨论】:

  • 我们不知道没有任何等待机制,因为没有给出checkChanges()。 Executor API 在这里如何应用?
【解决方案3】:

如前所述,CPU 将达到最大值。 但是您可以通过等待一些固定的时间来轻松防止这种情况,例如1 秒,循环结束:

try { Thread.sleep(1000); } catch (InterruptedException ex) {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2014-09-03
    • 2021-09-02
    • 2020-09-09
    相关资源
    最近更新 更多