经过一些试验和错误后,我设法让它按照我想要的方式工作。
但是现在我希望你的建议是让代码更具可读性和简单性,似乎需要很多不必要的代码来存档我想要的东西。
这基本上做的是,如果你一次打开服务器应用程序应该运行一个计划任务,它将启动任务并让它运行从它应该启动的时间开始,否则它将是计划在应该运行的那个小时运行。
因此,如果计划时间是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);
所以我现在的问题是我可以改进上面的代码吗?
答案 0 :(得分:0)
不要单独使用java.util.Timer
,而是尝试将其与TimerTask
一起使用。 IBM就此发表了一篇很好的文章。
请看一下这个链接:http://www.ibm.com/developerworks/java/library/j-schedule.html
代码也是共享的,似乎适用于琐碎的日常工作。
答案 1 :(得分:0)
使用此代替第一种方法:
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时执行你的日常任务。
更高级的方式是涉及与操作系统进行交互,以便在预先安排的时间(甚至可能在必要时启动应用程序)对您的应用程序进行回调,但这种事情是特定于操作系统/平台的(您没有' t指定)。
更新:我对Linux一无所知,但看起来cron
工作正是您正在寻找的。看到这个问题: