Java 任务 Timer,TimerTask 的使用

1 : 基本概念 : 什么是 Timer ? TimerTask ?
Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定 执行一次 或者 反复执行多次
Timer 线程安全 的,可扩展到大量同时安排的任务(存在数千个都没有问题)。其所有构造方法都启动计时器线程。可以调用cancel()终止此计时器,丢弃所有当前已安排的任务。purge()从此计时器的任务队列中移除所有已取消的任务。此类不提供实时保证:它使用Object.wait(long) 方法来安排任务。

   TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务它有一个抽象方法run()----计时器任务要执行的操作。因此,每个具体的任务类都必须继承TimerTask类,并且重写run()方法。


在JDK中的定义如下:

  • public abstract class TimerTask
    extends Object
    implements Runnable
    A task that can be scheduled for one-time or repeated execution by a Timer.

2 : Timer ,TimerTask 的基本方法:

Timer类的方法:

void cancel()     终止此计时器,丢弃所有当前已安排的任务。

  
int purge()     从此计时器的任务队列中移除所有已取消的任务。  

 
  void schedule(TimerTask task, Date time)    安排在指定的时间执行指定的任务。

  
  void schedule(TimerTask task, Date firstTime, long period)    安排指定的任务在指定的时间开始进行重复的固定延迟执行。

  
  void schedule(TimerTask task, long delay)    安排在指定延迟后执行指定的任务。

  
  void schedule(TimerTask task, long delay, long period)     安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。

  
  void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)    安排指定的任务在指定的时间开始进行重复的固定速率执行。

  
  void scheduleAtFixedRate(TimerTask task, long delay, long period)    安排指定的任务在指定的延迟后开始进行重复的固定速率执行。  

     


TimerTask 类的方法:

boolean cancel()     取消此计时器任务。 

  
abstract  void run()      此计时器任务要执行的操作。 

  
 long scheduledExecutionTime()   返回此任务最近实际 执行的已安排 执行时间。   



3  : 使用步骤:

a :创建一个java类A,类A必须继承TimerTask类,重写run()方法,方法里面实现任务的业务逻辑;
a :new()一个需要被执行的TimerTask对象B;
b :创建一个Timer实例对象C,C调用C. schedule()方法 , 通过 schedule()方法参数指定任务对象B和执行规则;

4 :例子:

import  java.util.TimerTask;
  
public  class  TaskA  extends  TimerTask{
  
     private  int  id;
     public  TaskA ( int  id){
         this .id = id;
     }
      
     @Override
     public  void  run() {
         System.out.println( "start run taskA ; id = " + id ); 
     }   
}


import  java.util.Date;
import  java.util.Timer;
   
public  class  Test1 {
       
     public  static  void  main(String[] args) {
         Timer timer =  new  Timer(); 
  
         timer.schedule( new  TaskA ( 1 ),  5000 ); // 5秒后启动任务
          
        
TaskA secondTask=  new  TaskA ( 2 );
         timer.schedule(secondTask,  1000 3000 ); // 1秒后启动任务,以后每隔3秒执行一次线程
          
         Date date =  new  Date();
         timer.schedule( new  TaskA ( 3 ), new  Date(date.getTime()+ 1000 )); //以date为参数,指定某个时间点执行线程 ,一秒后执行,执行一次
          
         System.out.println( "end in main thread..." );
     }
}



5 :常见问题解惑:

a : 任务本身执行所消耗的时间大于间隔时间,是怎么处理的?

schedule() 方法被用来延迟指定时间来执行某个指定任务。如果你需要周期性重复执行定时任务可以使用scheduleAtFixedRate或者scheduleWithFixedDelay方法,它们不同的是前者以固定频率执行,后者以相对固定频率执行。 


不管任务执行耗时是否大于间隔时间,scheduleAtFixedRate和scheduleWithFixedDelay都不会导致同一个任务并发地被执行。唯一不同的是scheduleWithFixedDelay是当前一个任务结束的时刻,开始结算间隔时间,如0秒开始执行第一次任务,任务耗时5秒,任务间隔时间3秒,那么第二次任务执行的时间是在第8秒开始。 


ScheduledExecutorService的实现类,是ScheduledThreadPoolExecutor。ScheduledThreadPoolExecutor对象包含的线程数量是没有可伸缩性的,只会有固定数量的线程。不过你可以通过其构造函数来设定线程的优先级,来降低定时任务线程的系统占用。 


特别提示:通过ScheduledExecutorService执行的周期任务,如果任务执行过程中抛出了异常,那么过ScheduledExecutorService就会停止执行任务,且也不会再周期地执行该任务了。所以你如果想保住任务都一直被周期执行,那么catch一切可能的异常。 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值