定时任务调度(Timer篇)

Timer由JDK提供,可以实现简单的任务调度场景。Timer只有一个后台线程,所以在使用在注意其场合。定时器是异步执行,不影响定时器后面代码的运行!

虽然一个Timer可以运行多个定时任务,但是一个Timer是串行运行

Timer的使用禁区:1、对时效性要求比较较高的多任务并发作业    2、对复杂任务的调度

Timer的缺陷:1、管理并发的缺陷以及任务之间的协同缺陷(因为后台只有一个线程)  2、当任务抛出异常时的缺陷(所有task终止)同时也不支持例如每周三运行任务这样的模式

 

 

这里还介绍了Timer和TimerTask的几个常用方法

TimerTask的cancel、scheduledExecutionTime方法。

Timer的schedule、scheduleAtFixedRate、cancel、purge方法

 

Timer中schedule和scheduleAtFixedRate的区别:(具体用法见下面的demo)

  1. 首次计划执行时间早于当前的时间
  2. 任务执行所需时间超出任务的执行周期间隔

 

 

下面是Timer的使用:

Timer需要搭配TimerTask使用

TimerTask:

package timer;

import java.util.TimerTask;

/**
 * @Author Rhine
 * @Date 2019/1/21 0:44
 **/
public class MyTimerTask extends TimerTask {

    private String name;

    public MyTimerTask(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public void run() {
        //打印当前name的内容
        System.out.println("Current exce name is: "+name);

    }
}

 Timer:

package timer;

import java.util.Timer;

/**
 * @Author Rhine
 * @Date 2019/1/21 0:46
 **/
public class MyTimer {

    public static void main(String[] args) {

        //1.创建一个timer实例
        Timer timer=new Timer();
        //2.创建一个MyTimerTask实例
        MyTimerTask myTimerTask=new MyTimerTask("No.1");
        //3.通过timer定时定频率调用myTimerTask的业务逻辑
        // 即第一次执行实在当前时间的两秒之后,之后每隔一秒钟执行一次
        timer.schedule(myTimerTask,2000L,1000L);

    }
}

 

Timer有schedule和scheduleAtFixedRate两种方法

其中schedule的有四种用法,scheduleAtFixedRate有两种用法

package timer;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;

/**
 * @Author Rhine
 * @Date 2019/1/21 0:46
 **/
public class MyTimer {

    public static void main(String[] args) {

        //1.创建一个timer实例
        Timer timer=new Timer();
        //2.创建一个MyTimerTask实例
        MyTimerTask myTimerTask=new MyTimerTask("No.1");
        //3.通过timer定时定频率调用myTimerTask的业务逻辑

        // 即第一次执行实在当前时间的两秒之后,之后每隔一秒钟执行一次
//        timer.schedule(myTimerTask,2000L,1000L);

        /**
         * 获取当前时间,并设置成距离当前时间三秒之后的时间
         * 如当前是2016-11-10 23:59:57
         * 则设置后的时间则为2016-11-11 00:00:00
         */
        Calendar calendar=Calendar.getInstance();
        SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sf.format(calendar.getTime()));
        calendar.add(Calendar.SECOND,3);

        //------------------------ schedule的四种用法 -------------------------------

        /**
         *  schedule(task,time)
         *  1.在时间等于或超过time的时候执行且仅执行一次task
         *   如在2016-11-11 00:00:00执行一次task:打印任务的名字
         */
//        myTimerTask.setName("schedule1");
//        timer.schedule(myTimerTask,calendar.getTime());



        /**
         *  schedule(task,time,period)
         *  2.时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task
         *   如在2016-11-11 00:00:00执行一次task:打印任务的名字,之后每隔两秒执行一次task
         */
//        myTimerTask.setName("schedule2");
//        timer.schedule(myTimerTask,calendar.getTime(),2000);


        /**
         *  schedule(task,delay)
         *  3.等待delay毫秒后执行且仅执行一次task
         *  如在2016-11-11 00:00:01执行一次task:打印任务的名字
         */
//        myTimerTask.setName("schedule3");
//        timer.schedule(myTimerTask,1000);


        /**
         *  schedule(task,delay,period)
         *  4.等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task
         */
//        myTimerTas
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值