最后,在经历了一些尝试和错误之后,我设法让它按我想要的那样工作。
但现在我希望你的建议,使代码更易读和简单,它似乎做了很多不必要的代码归档我想要的。
这样做的基本目的是,如果你在计划任务应该运行的时候打开服务器应用程序,它将启动任务,并让它在应该开始运行的剩余时间内运行,否则它将被安排在它应该运行的时间运行。
因此,如果计划时间是13:00:00,应该运行120分钟,而您在13:30启动应用程序,它将运行90分钟。如果您在该时间之后启动它,它将正常安排在第二天13:00:00。
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
long start_time = calendar.getTimeInMillis() - System.currentTimeMillis();
if (start_time < 0)
{
long minutes = (start_time*-1) / (60 * 1000);
if (minutes > 0 && minutes < 120)
{
runTimeLeft = 120 - minutes;
ThreadPoolManager.getInstance().schedule(new Runnable()
{
public void run()
{
myTask();
}
}, 0);
}
else
runTimeLeft = 0;
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour+24);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
start_time = calendar.getTimeInMillis() - System.currentTimeMillis();
}
ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable()
{
public void run()
{
myTask();
}
}, start_time, 24 * 60 * 60 * 1000);所以我现在的问题是,我可以对上面的代码进行哪些改进?
发布于 2011-02-24 10:59:08
尝试将其与TimerTask一起使用,而不是单独使用java.util.Timer。IBM在这方面有一篇很好的文章。
看看这个链接:http://www.ibm.com/developerworks/java/library/j-schedule.html
代码也是共享的,似乎也适用于琐碎的日常工作。
发布于 2011-02-24 11:01:48
在您的第一个方法中使用以下代码:
int interval = 24 * 60 * 60 * 1000; // might be long instead of int
ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable()
{
public void run()
{
myTask();
}
}, interval, interval);这将创建一个简单的计时器,它将在24小时内调用myTask(),然后每24小时调用一次。
不过,您的另一个需求略有不同。如果我正确理解你的描述,你基本上希望你的应用程序总是在12:00 AM执行一些任务,如果它碰巧启动并运行的话。如果你不关心精确到毫秒级的精度,你可以很简单地通过启动一个计时器和一分钟的周期来检查当前的系统时间-当你到达12:00 AM时运行你的日常任务。
一种更花哨的方式是与操作系统交互,这样它就会在预先计划的时间回调你的应用程序(如果需要,甚至可能启动你的应用程序),但这种事情是特定于操作系统/平台的(你没有指定)。
我对Linux一无所知,但看起来你正在寻找一份cron工作。请参阅此问题:
https://stackoverflow.com/questions/5099711
复制相似问题