我在java编程中表现得很好......我正在编写一个调度程序。我正在从属性文件中读取日期和时间值。如果属性文件中有任何更改,那么我必须重新安排调度程序..所以为此我正在编写一个无限循环,如下所示:
for(;;){
result = loadData.checkChanges();
if(result == true){
//If changes found in the properties file then reSchedule tasks
reSchedule();
}
}
如果循环运行到“应用程序服务器”(一年或两年)中应用程序的生命周期,它是否会遇到任何性能问题或JVM问题或是否还有其他问题?
答案 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) {}