java定时执行任务(一)

需求:

经常遇到这样的需求:要求每天执行一次任务,执行任务时间是凌晨3点

实现:

为了便于检测,我假设的是下一分钟执行任务,每10秒重复执行。(对应现实项目:每天3点执行任务。那么就是下一个3点执行任务,并每次sleep24小时)

TimerManager.java

package cn.test.test;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class TimerManager {
	//定义时间间隔  根据具体情况定 我假设每10s执行一次
    private static final long PERIOD_DAY = 10 * 1000;  
    public TimerManager() {  
         Calendar calendar = Calendar.getInstance();   
                  
         /*** 定制下一分钟执行方法 ***/  
  
         calendar.set(Calendar.HOUR_OF_DAY, 3);  
         calendar.set(Calendar.MINUTE, 0);  
         calendar.set(Calendar.SECOND, 0);  
            
         Date date=calendar.getTime(); //第一次执行定时任务的时间  
         System.out.println(date);  
         System.out.println("before 方法比较:"+date.before(new Date()));  
         //如果第一次执行定时任务的时间 小于 当前的时间  
         //此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。循环执行的周期则以当前时间为准  
         if (date.before(new Date())) {  
             date = this.addDay(date, 1);  
             System.out.println(date);  
         }  
            
         Timer timer = new Timer();  
            
         LyzTimerTask task = new LyzTimerTask();  
         //安排指定的任务在指定的时间开始进行重复的固定延迟执行。  
         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();  
        }
        
        public static void main(String[] args) {
			new TimerManager();
		}
}

LyzTimerTask.java

package cn.test.test;

import java.text.SimpleDateFormat;
import java.util.TimerTask;

public class LyzTimerTask extends TimerTask{
	private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
	timePrint time = new timePrint();
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			time.nowTime();
		} catch (Exception e) {
			System.out.println("定时分析错误");
		}
	}

}

timePrint.java

package cn.test.test;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class timePrint {
	private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
	public static void nowTime(){
		System.out.println("执行当前时间"+formatter.format(Calendar.getInstance().getTime()));  
	}
}

上述程序我们就可以实现定时执行timePrint中的nowTime函数。

为了更完美测试,我写了另外一个主函数,在上述程序的线程自动调用timePrint自动执行时,我用新的主函数访问执行timePrint,结果是可以同步并不会报错。

package cn.test.test;

public class testTimer {
	public static void main(String[] args) {
		timePrint time = new timePrint();
		time.nowTime();
	}
}

 

posted @ 2017-11-06 14:13  K_artorias  阅读(1820)  评论(0编辑  收藏  举报