Timer简单使用

什么是定时任务调度?

基于给定的时间点、时间间隔、执行次数自动执行任务


作用:定时记录日志,定时备份数据、定时推送信息等等

Timer的定义:有且仅有一个后台线程对多个业务线程进行定时定频率的调度(jdk自带,位于java.util包)

主要构件

TimerTimerTask

                          


Timer函数
cancel() 终止此计时器,丢弃所有当前已安排的任务
purge() 返回从队列中移除的任务数


schedule函数

schedule(task, time) 在时间等于或超过time(time早于当前时间)的时候执行且仅执行一次

schedule(task, time, period) 在time时首次执行,接下来每隔period就执行一次

schedule(task, delay) 比当前时间推迟delay秒且仅执行一次

schedule(task, delay, period) 在time时首次执行,接下来每隔period就执行一次

scheduleAtFixedRate(task, time, period)

scheduleAtFixedRate(task, delay, period)

TimerTask

cancel() 取消当前TimerTask里的任务

scheduleExecutionTime() 返回最近执行此任务的时间,long型

schedule与scheduleAtFixedRate的区别

一、当首次执行时间早于当前时间的情况下(time为00:00:00,当前时间为00:00:06):

1.schedule:如果第一次执行的时间早于当前时间,则第一次执行的时间

等于当前时间,从当前时间开始执行。

2.scheduleAtFixedRate:如果第一次执行的时间早于当前时间,则会

把早出来的时间间隔内能执行的次数给弥补上,并为了赶上进度使用了

同步,多次执行任务,因此run方法内要考虑同步问题。

二、任务执行所需时间超出任务的执行间隔时间的情况下(period为2秒,任务执行周期为3秒):

1.schedule:下次的执行时间等于上次执行完成时间,因此执行时间不断延后,

也就是说我们设置的period已经失效,以任务完成时间为准执行下个任务。

2.scheduleAtFixedRate:下次的执行时间等于上次开始执行任务的时间加上period,

不会延后,存在并发性

总结一下,就是scheduleAtFixedRate严格遵守我们设置的time和period,固定不变,但是我们

要注意scheduleAtFixedRate存在并发问题,在run方法里该加锁的地方要加锁。

Timer的缺陷

1.管理并发任务的缺陷

Timer有且仅有一个线程去执行定时任务,如果存在多个执行周期较长的任务,会导致执行效果与预期不符,

比如不能同时执行一个任务。

2.当任务抛出异常时的缺陷

如果TimerTask抛出RuntimeException,Timer会停止所有任务的运行


Timer使用禁区

1.对时效性要求较高的多任务并发作业

2.对复杂的任务的调度,因为一旦抛出异常就结束所有任务,

且Timer基于时间,不能基于日历,比如星期,日,月等


简单例子

1.写一个类继承TimerTask,重写run方法

package timerTest;

import java.util.TimerTask;

/**
 * writer: holien
 * Time: 2017-07-30 23:25
 * Intent: 任务类
 */
public class MyTimerTask extends TimerTask {

    @Override
    public void run() {
        System.out.println("timerTask has been done");
    }

}
2.写一个Timer类调用MyTimerTask

package timerTest;

import java.util.Timer;
import java.util.TimerTask;

/**
 * writer: holien
 * Time: 2017-07-30 23:24
 * Intent: 调度器类
 */
public class MyTimer {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new MyTimerTask(), 2000L, 1000L);
        // 若业务逻辑较简单,直接使用匿名内部类重写run方法
//        timer.schedule(new TimerTask() {
//            @Override
//            public void run() {
//                System.out.println("job has been executed...");
//            }
//        }, 2000L, 1000L);
    }
}


在综合标签里记录了quartz的学习,点我打开quartz学习记录


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值