日期:2014-05-17  浏览次数:20725 次

java 每天3点到4点每隔5分钟执行一次
我之前写了一个是每天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 执行一次。