• 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();
    	}
    }
  • 相关阅读:
    Linux常用命令集合
    运用栈实现表达式求值(+,-,*,/运算)
    队列
    变参函数
    C语言--递归程序的设计
    指针的灵活应用--内核链表中的container_of
    C语言-求回文数字
    压力测试和负载测试
    测试理论
    Dubbo接口调用
  • 原文地址:https://www.cnblogs.com/K-artorias/p/7792909.html
Copyright © 2020-2023  润新知