多线程每小时运行一次Java代码
我正在尝试编写一个简单的Java程序,当分针在20时,它每小时运行一些代码。问题是,我这样做是难以置信的CPU密集型。我熟悉石英,但我正在寻找一个更简单的解决方案,有什么想法吗
boolean run = true;
while(run){
Calendar calendar = new GregorianCalendar();
int minute = calendar.get(Calendar.MINUTE);
if(minute == 20){
//Do some Stuff
}
}
# 1 楼答案
我建议您从java程序中删除调度逻辑
通过这样做,您可以只关注您希望程序执行的操作,并将调度部分留给操作系统
也可以说,例如,你决定在某个时候编写一个C++程序,它可以完成java代码所知道的,你不必在新程序中实现CRON逻辑。
# 2 楼答案
请注意,如果应用程序在托管环境(web或ejb容器)中运行,则不允许使用
Thread.sleep()
或任何其他与线程相关的操作,为此,请查看EJB restrictions页面。我对此提出警告,因为问题被标记为java-ee
,所以“简单应用程序”可能根本就不是那么简单——如果它在JavaEE容器中运行,那么还有其他需要注意的事项如果您正在构建企业级应用程序,请忘记
Thread.sleep()
。选择一个成熟的作业调度器,使用Quartz,它是一个开源的、非常成熟和可靠的产品。或者使用Obsidian Scheduler,这是一个功能丰富的商业调度程序,比Quartz具有更多现成的功能对于成熟的调度器(但适合在容器中运行)来说,一个轻量级的替代方案是使用Timer service
# 3 楼答案
将您的代码放在无限长的时间内,然后使用
20点后开始执行
示例
# 4 楼答案
查看java.util.Timer方法scheduleAtFixedRate()
# 5 楼答案
您可能在调用之间查找^{}
# 6 楼答案
一个简单的解决方案是使用Executors框架:
并使用一些逻辑来找出
secondsToFirstOccurence
。这可能会涉及一个Calendar
实例,但使用JodaTime会方便得多