线程定时任务调度Timer


**********************************Timer的缺陷********************************

1、管理并发任务的缺陷

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

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

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


********************************Timer的使用禁区**************************

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

2、对复杂的任务的调度

------------------------------------------Timer--------------------------------------

1、Timer是jdk自带的

2、Timer的定义:有且仅有一个  后台线程   对多个   业务线程   进行   定时定频率的调度

3、主要构件:Timer(后台线程)和TimerTask(业务线程,继承)

4、实例步骤:


    1、Timer timer  = new Timer();

    2、MyTimerTask my = new MyTimerTask();//自定义的类,继承自TimerTask,重写run方法

    3、timer.schedule(my,2000L,1000L)//第一次执行是在当前时间的2秒之后,之后每隔1秒执行一次
                    
                        my里面的run方法


--------------------------------------Timer的定时调度函数----------------------

1、schedule的四种用法

①schedule(task,time):
  
  参数:
 
       1、task-所要安排的任务

       2、time-执行任务的时间    

  作用:在时间等于或超过time的时候执行且只执行  一次task

②schedule(task,delay):

  参数:

      1、task-所要安排的任务

      2、delay-执行任务前的延迟时间,单位是毫秒

  作用:等待delay毫秒之后,执行task,只执行一次task
 
③schedule(task,time,period):

  参数:

       1、task-所要安排的任务

       2、time-首次执行任务的时间

       3、period-执行一次task的时间间隔,单位是毫秒

  作用:时间等于或超过time时,首次执行task,之后每隔period毫秒重复执行一次

 
④schedule(task,delay,period):

  参数:

       1、task-所要安排的任务

       2、delay-执行任务前的延迟时间,单位是毫秒

       3、period-执行一次task的时间间隔,单位是毫秒

  作用:等待delay毫秒之后,首次执行task,之后每隔period毫秒重复执行一次
       
2、scheduleAtFixedRate的两种用法

①scheduleAtFixedRate(task,delay,period):

  参数:

       1、task-所要安排的任务

       2、delay-执行任务前的延迟时间,单位是毫秒

       3、period-执行一次task的时间间隔,单位是毫秒

  作用:等待delay毫秒之后,首次执行task,之后每隔period毫秒重复执行一次
   

②scheduleAtFixedRate(task,time,period):

  参数:

       1、task-所要安排的任务

       2、time-首次执行任务的时间

       3、period-执行一次task的时间间隔,单位是毫秒

  作用:时间等于或超过time时,首次执行task,之后每隔period毫秒重复执行一次


---------------------------------------Timer的其它重要函数------------------------------

***************************************TimerTask的重要函数*******************************


①cancle():

  作用:取消当前Timertask里的任务


package com.imooc.thread.timer;

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

public class MyTimerTask2 extends TimerTask{
    private String name;
    private Integer count = 0;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public MyTimerTask2(String name){
        this.name = name;
    }
    @Override
    public void run() {
        if(count < 3){
            Calendar c = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            System.out.println(sdf.format(c.getTime()));
            System.out.println("current name is:" + name);
            count ++;
        }else{
            this.cancel();//取消当前的任务
            System.out.println("Timertask任务已经取消");
        }
    }
}

***********************************Time的函数r*********************************

1、Timer类的cancel()方法

   作用:终止此计时器,丢弃所有当前已安排的任务

***********与TimerTask的cancel()方法的区别:TimerTask的cancel()方法只能取消TimerTask的单个任务,

                                           而Timer的cancel()方法能取消所有任务


2、Timer类的purge()方法

   作用:从此计时器的任务队列中移除所有已取消的任务

   返回值:从队伍中移除的任务数


***************************Timer类的schedule方法和scheduleAtFixedRate方法的区别********************


(1)schedule方法:“fixed-delay”;如果第一次执行时间被delay(延迟)了,随后的执行时间按 照 上一次 实际

执行完成的时间点 进行计算。

(2)scheduleAtFixedRate方法:“fixed-rate”;如果第一次执行时间被delay了,随后的执行时间按照 上一次开始

的 时间点 进行计算,并且为了”catch up”会多次执行任务,TimerTask中的执行体需要考虑同步

***********************当执行任务的时间大于周期间隔时,会发生什么呢?*****************

(1)schedule方法:下一次执行时间相对于 上一次 实际执行完成的时间点 ,因此执行时间会不断延后

(2)scheduleAtFixedRate方法:下一次执行时间相对于上一次开始的 时间点 ,因此执行时间不会延后,存在并发性


 

猜你喜欢

转载自blog.csdn.net/qq_36567480/article/details/87881856
今日推荐