zoukankan      html  css  js  c++  java
  • 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
    上的方法
     
  • 相关阅读:
    蓝鲸财经新闻记者实战培训
    雷军解密小米商业内核
    OpenGL6-纹理动画
    OpenGL5-纹理贴图
    OpenGL4-绘制旋转的立方体
    OpenGL3-绘制各种图元绘制
    OpenGL2-绘制三角形
    OpenGL1-创建窗口(建立Win32的OpenGL开发环境 )(代码上传)
    一步步做程序优化-讲一个用于OpenACC优化的程序(转载)
    常用编译选项介绍
  • 原文地址:https://www.cnblogs.com/sunxucool/p/2800001.html
Copyright © 2011-2022 走看看