• java定时程序方法 悟寰轩


    1,定时凌晨1点执行(由于Quartz 2.0和spring目前版本不兼容,所以采取如下方法,不知道spring3.2会不会修复这个bug
           
    public void doTask(CheckSpiderService doCheck) {
    // 获取当前时间
    Calendar currentDate = Calendar.getInstance();
    long currentDateLong = currentDate.getTime().getTime();
    // 计算满足条件的最近一次执行时间
    Calendar earliestDate = getEarliestDate(currentDate, 1, 0, 0);
    long earliestDateLong = earliestDate.getTime().getTime();
    // 计算从当前时间到最近一次执行时间的时间间隔
    long delay = earliestDateLong - currentDateLong;
    // 计算执行周期为一天
    long period = 24 * 60 * 60 * 1000;
    ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
    // 从现在开始delay毫秒之后,每隔一天执行一次,转换为毫秒
    service.scheduleAtFixedRate(doCheck, delay, period, TimeUnit.MILLISECONDS);
    }
    public Calendar getEarliestDate(Calendar currentDate, int hourOfDay, int minuteOfHour, int secondOfMinite) {
    // 计算当前时间的WEEK_OF_YEAR,DAY_OF_WEEK, HOUR_OF_DAY, MINUTE,SECOND等各个字段值
    int currentHour = currentDate.get(Calendar.HOUR_OF_DAY);
    int currentMinute = currentDate.get(Calendar.MINUTE);
    int currentSecond = currentDate.get(Calendar.SECOND);
    // 如果输入条件中的currentHour小于当前日期的dayOfWeek,则currentHour需要推迟一天
    boolean dayLater = false;
    if (hourOfDay < currentHour) {
    dayLater = true;
    } else if (hourOfDay == currentHour) {
    // 当输入条件与当前日期的 hourOfDay相等时,
    // 如果输入条件中的minuteOfHour小于当前日期的
    // currentMinute,则WEEK_OF_YEAR需要推迟一天
    if (minuteOfHour < currentMinute) {
    dayLater = true;
    } else if (minuteOfHour == currentSecond) {
    // 当输入条件与当前日期的dayOfWeek, hourOfDay,
    // minuteOfHour相等时,如果输入条件中的
    // secondOfMinite小于当前日期的currentSecond,
    // 则WEEK_OF_YEAR需要推迟一天
    if (secondOfMinite < currentSecond) {
    dayLater = true;
    }
    }
    }
    if (dayLater) {
    // 设置当前日期中的WEEK_OF_YEAR为当前天推迟一天
    currentDate.set(Calendar.DAY_OF_WEEK, currentDate.get(Calendar.DAY_OF_WEEK) + 1);
    }
    // 设置当前日期中的HOUR_OF_DAY,MINUTE,SECOND为输入条件中的值。
    currentDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
    currentDate.set(Calendar.MINUTE, minuteOfHour);
    currentDate.set(Calendar.SECOND, secondOfMinite);
    return currentDate;
    }
    2, java.util.Timer  第二种就比较简单了
    继承 TimerTask
    重写 run
    
    
    public class TimerTest extends TimerTask {
    @Override public void run() { syso("OK");} 
    public static void main(String[] args) { 
     Timer timer = new Timer(); 
    long delay = 2 * 1000; long period = 2000; 
    // 从现在开始 2 秒钟之后,每隔 2 秒钟执行一次 
    timer.schedule(new TimerTest(), delay, period); 
     } 
     } 
    3,Quartz 的应用
    ……这个不多说,内容很多。
    public void schedule(TimerTask task,
      long delay) 说明:该方法会在设定的延时后执行一次任务。
    
    
    public void schedule(TimerTask task,
      Date time) 说明:该方法会在指定的时间点执行一次任务。
    
    
    public void schedule(TimerTask task,
      long delay,
      long period) 说明:该方法会在指定的延时后执行任务,并且在设定的周期定时执行任务。
    
    
    public void schedule(TimerTask task,
      Date firstTime,
      long period) 说明:该方法会在指定的时间点执行任务,然后从该时间点开始,在设定的周期定时执行任务。特别的,如果设定的时间点在当前时间之前,任务会被马上执行,然后开始按照设定的周期定时执行任务。
    
    
    
    
    想了解更多,可以参考:http://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/index.html
    上的方法
     
  • 相关阅读:
    EF4.1中诡异的GUID为空问题
    asp.net mvc3 Razor引擎中@使用规则小记
    【推荐】JS面象对象编程视频教程
    【转】【More Effective C#】IEnumerable和IQueryable的那点事
    【你有更好的算法吗?】合并重叠时间段算法
    jquery处理textarea中的手动换行
    实例讲解遗传算法——基于遗传算法的自动组卷系统【理论篇】
    架设自己的NuGet服务器
    C#中用SelectSingleNode方法解析带有多个命名空间的XML文件
    解析入口参数为实体的表达式树
  • 原文地址:https://www.cnblogs.com/sunxucool/p/2800001.html
Copyright © 2020-2023  润新知