方法schedule与scheduleAtFixedRate

java.util
类 Timer

方法摘要:

API底层全部调用的是此方法:
     sched(TimerTask task, long time, long period)
Timer的方法schedule和scheduleAtFixedRate在 执行TimerTask的时候,都以队列的方式一个一个的顺序执行,所以不需要考虑非线程安全的情况。
因为是队列方式执行,前面的任务可能消耗的时间较长,则后面的任务运行开始时间也会被延迟。
方法schedule和scheduleAtFixedRate主要区别在于Date firstTime是否小于当前时间(new Date())
情况1,使用schedule方法, Date firstTime<new Date()
    立即执行一次,之后以首次执行时间为开始时间,进 period执行
    参考图片一
情况2, 使用scheduleAtFixedRate方法, Date firstTime<new Date()
    立即开始追赶执行,以firstTime开始计算,不考虑period进行执行,直到追赶上应该执行的次数,再根据period执行
    参考图片二
情况3,Date firstTime>=new Date()
    等待到时间开始执行,下一次执行任务的时间参考的是上一次任务“结束”时的时间来计算

public class Run5_2 {
 private static Timer timer=new Timer();
 public static class MyTask extends TimerTask{
  @Override
  public void run() {
   SimpleDateFormat fTime1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
   SimpleDateFormat fTime2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
   System.out.println("start:executing..."+fTime1.format(new Date()));
   try {
    Thread.sleep(5000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   System.out.println("e n d:executing..."+fTime2.format(new Date()));
  }
 }
 public static void main(String[] args) {
  try {
   MyTask mt=new MyTask();
   SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
   Date d1 = fTime.parse("2016/01/28 14:15:00");
   
   SimpleDateFormat fTimes = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
   SimpleDateFormat fTimee = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
   System.out.println("start :"+fTimes.format(new Date()));
   System.out.println("target:"+fTimee.format(d1));
   /**
    * (TimerTask task, Date firstTime, long period)
    * 若firstTime<当前时间
    * 超过启动时间,立即开始忽略period,追赶错过的执行次数
    * 直到追赶够次数,才会按照period执行
    * 仍然按照firstTime开始算period
    */
   timer.scheduleAtFixedRate(mt,d1, 10000);
   /**
    * (TimerTask task, Date firstTime, long period)
    * 若firstTime<当前时间
    * 超过启动时间,立即执行一次,从现在开始算period
    * 按照第一次执行的时间算period
    */
   //timer.schedule(mt,d1, 10000);
  } catch (ParseException e) {
   e.printStackTrace();
  }
 }
}
图片情况1: 使用schedule方法, Date firstTime<new Date()
图片情况2: 使用scheduleAtFixedRate方法, Date firstTime<new Date()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值