我是java编程的stater。。。我正在写一个时间表。我正在从属性文件中读取日期和时间值。如果属性文件中有任何更改,那么我必须重新安排调度程序。。因此,我正在写一个无限for循环,如图所示:
for(;;){
result = loadData.checkChanges();
if(result == true){
//If changes found in the properties file then reSchedule tasks
reSchedule();
}
}
如果循环一直运行到应用程序在"应用程序服务器"中的生命周期(一年或两年),它会遇到任何性能问题或JVM问题,或者还有其他问题吗?
除非您的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
是一个布尔变量,当您的应用程序上下文被破坏(服务器关闭、web应用程序取消部署等)时,它会被设置为true。
这将是一个巨大的cpu占用者,因为它正在运行一个没有任何轮询或等待机制的无限循环。对于这种工作,最好使用java执行器API:http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executor.html
如前所述,CPU将达到最大值。但你可以通过在循环结束时等待一些固定的时间来很容易地防止这种情况,例如1秒:
try { Thread.sleep(1000); } catch (InterruptedException ex) {}