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(); } }