利用Timer写一个最简单的定时任务

首先创建一个MyTimerTask类,让他继承TimerTask,实现run方法,run方法中写的就是这个所执行任务的业务逻辑。而这一整个类就是作为定时任务中的任务。

package com.csyd.timer;

import java.util.TimerTask;

/**
 * Created by ChengShanyunduo
 * 2018/3/1
 */
public class MyTimerTask extends TimerTask{


    private String name;

    public MyTimerTask(String inputName){
        name = inputName;
    }


    @Override
    public void run() {
        //打印当前name的内容
        System.out.println("我的Timer名字是:" + name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

然后再main函数中实例化一个Timer,在创建一个task。 Timer中要传进去3个参数,第一个参数是task,就是刚刚创建的类, 也就是你想要执行的事情,第二个参数是long型, 秒数, 代表要多久之后开始执行, 第三个参数也是秒数, 代表每隔多久执行一次。

import com.csyd.timer.MyTimerTask;

import java.util.Timer;

public class Main {

    public static void main(String[] args) {
        //创建Timer实例
        Timer timer = new Timer();
        //创建TimerTask实例
        MyTimerTask myTimerTask = new MyTimerTask("No.1");
        //t通过timer定时定频率调用myTimerTask的业务逻辑
        //当前时间的2秒钟之后每隔一秒钟执行一次
        timer.schedule(myTimerTask, 2000L, 1000L);

    }
}

这个定时任务执行出来就是,2秒之后, 每隔1秒打印一个task的名字No.1。


schedule的4种用法

1.schedule(task, time)

task(TimerTask):要执行的任务

time(Date):执行的时间(什么时候去执行),只执行一次,如果time早于现在的时间,就会立即执行。

2.schedule(task, delay)

task(TimerTask):要执行的任务

delay(Long):多久后去执行,只执行一次。比如如果delay的值为2000,task就会在距离当前时间2秒后去执行。

3.schedule(task, time, period)

task(TimerTask):要执行的任务

time(Date):第一次执行任务的时间

period(Long):每隔多久执行一次。比如period的值为2000,task就会在第一次执行之后,每隔2秒执行一次任务。

4.schedule(task, delay, period)

task(TimerTask):要执行的任务

delay(Long):多久后去执行

period(Long):每隔多久执行一次


scheduleAtFixedRate的2种用法

1.scheduleAtFixedRate(task, time, period)

task(TimerTask):要执行的任务

time(Date):第一次执行任务的时间

period(Long):每隔多久执行一次。比如period的值为2000,task就会在第一次执行之后,每隔2秒执行一次任务。

2.scheduleAtFixedRate(task, delay, period)

task(TimerTask):要执行的任务

delay(Long):多久后去执行

period(Long):每隔多久执行一次


schedule和scheduleAtFixedRate的区别

1.如果第一次执行的时间被delay,比如设定的执行时间为12:00:00,但timer开始执行的时候是12:00:06,schedule会以此顺延时间,第一次执行时间就变为了12:00:06,而scheduleAtFixedRate会按照上一次开始的时间计算,为了赶上进度会多次执行任务,以此需要考虑同步。

2.任务执行需要的时间如果超出时间间隔,比如这个任务执行完需要3秒,而timer中定的周期为2秒,schedule会将执行的时间以此顺延,也就是完成了一个3秒的任务后,继续完成下一个任务,并且不会间断。而scheduleAtFixedRate时间不会顺延,会有并发性。


其他方法

1.TimerTask中

cancel() —— 取消当前TimerTask里的任务,在TimerTask的run方法中使用。

timerTask.scheduledExecutionTime() —— 返回此任务最近执行的已安排执行的时间(也就是下一次执行的时间),返回值为long。

2.Timer中

timer.cancle() —— 结束当前计时器,取消所有任务。

timer.purge() —— 从该计时器的任务队列中移除所有已取消的任务,返回值为移除的任务数。


Timer定时器的缺点

1.管理并发任务:Timer里有且只有一个线程去执行定时任务,如果存在多个任务且任务时间过长,会导致执行效果与预期不符,无法并发。

2.任务抛出异常:如果TimerTask抛出RuntimeException异常,Timer会停止所有的任务。


不建议使用Timer的情况

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

2.对复杂的任务的调度。



学习视频:https://www.imooc.com/learn/841





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值