我之前写了一个是每天3点执行
现在需求是每天3点开始,每隔5分钟执行一次,到4点截止,请问怎么改?
下面是我已经实现的每天3点定时任务代码:
public class TimerManager {
//时间间隔
private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
public TimerManager() {
Calendar calendar = Calendar.getInstance();
/*** 定制每日15:00执行方法 ***/
calendar.set(Calendar.HOUR_OF_DAY,15);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date date=calendar.getTime(); //第一次执行定时任务的时间
//如果第一次执行定时任务的时间 小于 当前的时间
//此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
if (date.before(new Date())) {
date = this.addDay(date, 1);
}
Timer timer = new Timer();
CommonTimerTask task = new CommonTimerTask();
//安排指定的任务在指定的时间开始进行重复的固定延迟执行。
timer.schedule(task,date,PERIOD_DAY);
}
// 增加或减少天数
public Date addDay(Date date, int num) {
Calendar startDT = Calendar.getInstance();
startDT.setTime(date);
startDT.add(Calendar.DAY_OF_MONTH, num);
return startDT.getTime();
}
}
------解决方案--------------------------------------------------------
思路 取hour ==3开始 过5分钟执行下方法,hour ==4时结束
------解决方案--------------------------------------------------------
定时器
- Java code
public class test extends TimerTask { @Override public void run() { System.out.println("asdsdasd"); Timer timer = new Timer() ; timer.schedule(new test(), new Date(System.currentTimeMillis()+2000)) ; } public static void main(String[] args) throws Exception { Timer timer = new Timer() ; timer.schedule(new test(), new Date(System.currentTimeMillis()+10000)) ;}
------解决方案--------------------------------------------------------
- Java code
package referer.test.csdn;import java.util.Calendar;import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class Test { public static void main(String[] args) { new Test(); } private Timer t = new Timer(); private class MyTask extends TimerTask { @Override public void run() { Calendar c = Calendar.getInstance(); // 处理该处理的程序 System.out.println("当前时间:" + c.getTime()); // 如果超过4点了就不执行了 if (c.get(Calendar.HOUR_OF_DAY) >= 4) { return; } // 否则定时5分钟之后继续 c.set(Calendar.MINUTE, c.get(Calendar.MINUTE) + 5); t.schedule(new MyTask(), c.getTime()); } } public Test() { t.schedule(new MyTask(), getTime(3), 1000 * 60 * 60 * 24); } // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); /** * 获取当天之后1天的开始时间 */ private Date getTime(int beginHour) { Calendar c = Calendar.getInstance(); c.set(Calendar.DATE, c.get(Calendar.DATE) + 1); c.set(Calendar.HOUR_OF_DAY, beginHour); c.clear(Calendar.MINUTE); c.clear(Calendar.SECOND); return c.getTime(); }}
------解决方案--------------------------------------------------------
Java 里面要实现这样的定时任务还有比较麻烦的,不建议自己去实现,把 Quartz 这个框架的 jar 加进来吧。对于你的这个用途,只用 Quartz 就可以了,不需要用什么 Spring 集成的。
如果需要自己实的话,可以使用 java.util.concurrent.DelayQueue,这个称为延迟队列,是 Java 集合框架的实现之一。存放进去的对象必须实现 java.util.concurrent.Delayed 和 java.lang.Comparable<T> 接口。在 Delayed 接口实现 public long getDelay(TimeUnit unit) 方法,如果在计算时返回值是小于等于 0 的话,那么在 DelayQueue 中使用 take 方法可以将其取出来。
我们可以在第一次往 DelayQueue 塞任务的时候,把下一次要执行的毫秒保存到这个任务对象中去。等时间一到,那 take 由阻塞状态变为运行状态,会将其中超时的对象取出来。取出来之后,计算下一次运行的毫秒数,再将这个对象塞回队列中去,同时在外部还有这个对象的引用,使用 ExecuteService 接口 submit 执行一次。