无限循环问题

时间:2011-06-20 01:52:51

标签: java performance uptime

我在java编程中表现得很好......我正在编写一个调度程序。我正在从属性文件中读取日期和时间值。如果属性文件中有任何更改,那么我必须重新安排调度程序..所以为此我正在编写一个无限循环,如下所示:

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

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

3 个答案:

答案 0 :(得分:3)

除非您的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。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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