2

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

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

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

4

3 回答 3

3

除非您的checkChanges()方法休眠或阻塞,否则当前编写的代码将通过loadData.checkChanges();尽可能快地调用处理器来破坏 CPU。理想情况下,您应该执行类似 call的操作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(;;). 而是 try while(true),它更清晰。或者更好的是,尝试while(!stop)wherestop是一个布尔变量,当您的应用程序上下文被销毁(服务器关闭、webapp 取消部署等)时该变量设置为 true。

于 2011-06-20T01:59:06.313 回答
1

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

于 2011-06-20T01:58:01.113 回答
1

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

try { Thread.sleep(1000); } catch (InterruptedException ex) {}
于 2011-06-20T02:04:44.337 回答