ScheduledExecutorService定时周期执行指定的任务

来源:互联网 发布:知可之伯母邪恶漫画 编辑:程序博客网 时间:2024/05/18 00:27

自己打败自己是最可悲的失败,自己战胜自己是最可贵的胜利。


本讲内容:ScheduledExecutorService定时周期执行指定的任务


一、由于Timer管理延时任务存在缺陷,因为Timer在执行定时任务时只会创建一个线程,所以如果存在多个任务,且任务时间过长,超过了两个任务的间隔时间,会发生一些缺陷:

http://blog.csdn.net/lmj623565791/article/details/27109467


二、ScheduledExecutorService 概述

ScheduleExecutorService接口中有四个重要的方法



scheduleAtFixedRate参数说明:

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,              long initialDelay,              long period,              TimeUnit unit);  

command:执行线程
initialDelay:初始化延时
period:两次开始执行最小间隔时间
unit:计时单位


scheduleWithFixedDelay参数说明:

public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,                  long initialDelay,                  long delay,                  TimeUnit unit);  

command:执行线程
initialDelay:初始化延时
period:前一次执行结束到下一次执行开始的间隔时间(间隔执行延迟时间)
unit:计时单位


示例一:按指定频率周期执行某个任务(初始化延迟0ms开始执行,每隔100ms重新执行一次任务。

/**  * 以固定周期频率执行任务  */  public static void executeFixedRate() {      ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);      executor.scheduleAtFixedRate(              new EchoServer(),  //执行这个任务            0,              100,              TimeUnit.MILLISECONDS);  }  


示例二:按指定频率间隔执行某个任务(初始化时延时0ms开始执行,本次执行结束后延迟100ms开始下次执行。

/**  * 以固定延迟时间进行执行  * 本次任务执行完成后,需要延迟设定的延迟时间,才会执行新的任务  */  public static void executeFixedDelay() {      ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);      executor.scheduleWithFixedDelay(              new EchoServer(),              0,              100,              TimeUnit.MILLISECONDS);  }  


示例三:周期定时执行某个任务。

有时候我们希望一个任务被安排在凌晨3点(访问较少时)周期性的执行一个比较耗费资源的任务,可以使用下面方法设定每天在固定时间执行一次任务。

/**  * 每天晚上8点执行一次  * 每天定时安排任务进行执行  */  public static void executeEightAtNightPerDay() {      ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);      long oneDay = 24 * 60 * 60 * 1000;      long initDelay  = getTimeMillis("20:00:00") - System.currentTimeMillis();      initDelay = initDelay > 0 ? initDelay : oneDay + initDelay;        executor.scheduleAtFixedRate(              new EchoServer(),              initDelay,              oneDay,              TimeUnit.MILLISECONDS);  }  

/**  * 获取指定时间对应的毫秒数  * @param time "HH:mm:ss"  * @return  */  private static long getTimeMillis(String time) {      try {          DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");          DateFormat dayFormat = new SimpleDateFormat("yy-MM-dd");          Date curDate = dateFormat.parse(dayFormat.format(new Date()) + " " + time);          return curDate.getTime();      } catch (ParseException e) {          e.printStackTrace();      }      return 0;  }  


4.上面示例辅助代码

class EchoServer implements Runnable {      @Override      public void run() {          try {              Thread.sleep(50);          } catch (InterruptedException e) {              e.printStackTrace();          }          System.out.println("This is a echo server. The current time is " +                  System.currentTimeMillis() + ".");      }  }  

http://blog.csdn.net/liguojin1230/article/details/50158769 用到执行定时任务

http://blog.csdn.net/tsyj810883979/article/details/8481621 参考文章



Take your time and enjoy it




0 0