java中Timer的使用

Timer用来做定时器的。里面有2个重要的变量 TaskQueue queue = new TaskQueue();这个用来管理任务的,TimerThread thread = new TimerThread(queue);这个用来处理任务,TimerThread 继承了Thread所以是一个线程。

TimerTask定时任务继承Runnable类,所以要实现run方法。


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;


public class StuedntTimerTask {
static SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
static int i =8;
static Timer  timer = null;
public static void main(String[] args) {

TimerTask timeTask = new TimerTask() {

@Override
public void run() {
Date date = new Date();

System.out.println(Thread.currentThread()+"1我被执行了"+sim.format(date));

try {
   i--;
   if(i < 0){
    i =1;
   }
Thread.sleep(i*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};



timer = new Timer();
Date date = new Date();
System.out.println(sim.format(date));
timer.schedule(timeTask, new Date(),3000);
//timer.scheduleAtFixedRate(timeTask, new Date(),3000);
}


}

timer.schedule(timeTask, new Date(),3000);//

打印结果如下:

Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:24
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:31
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:37
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:42
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:46
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:49
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:52
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:55
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:58
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:24:01
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:24:04
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:24:07
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:24:10
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:24:13

在结果中可以看出执行时只有一个线程在处理任务,当执行任务时间大于间隔时间时,程序会立马执行下个任务,当执行任务时间小于间隔时间时,schedule会按照间隔时间执行。

timer.scheduleAtFixedRate(timeTask, new Date(),3000)//

打印结果如下:

Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:30
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:37
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:43
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:48
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:52
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:55
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:57
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:58
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:58
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:59
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:00
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:03

Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:06

在结果中可以看出执行时只有一个线程在处理任务,当执行任务时间大于间隔时间时,程序会立马执行下个任务,当执行任务时间小于间隔时间时,scheduleAtFixedRate为了保持频率的稳定性,依然立马执行任务,当频率稳定了,按照间隔时间来执行任务。


schedule的方法:

  public void schedule(TimerTask task, Date firstTime, long period) {
        if (period <= 0)
            throw new IllegalArgumentException("Non-positive period.");
        sched(task, firstTime.getTime(), -period);

    }

   sched(task, firstTime.getTime(), -period);period变成的负数

scheduleAtFixedRated的方法:

   public void scheduleAtFixedRate(TimerTask task, Date firstTime,
                                    long period) {
        if (period <= 0)
            throw new IllegalArgumentException("Non-positive period.");
        sched(task, firstTime.getTime(), period);

    }

 sched(task, firstTime.getTime(), period);没变

算下次执行时间的方法:
 queue.rescheduleMin(
                                  task.period<0 ? currentTime   - task.period

                                                : executionTime + task.period);

在代码可以看出当period为负数时,下次执行时间是当前时间+时间间隔。为正数时是下次执行时间+时间间隔



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值