Java时间类库Timer的使用方法与实例详解

所属分类: 软件编程 / java 阅读数: 33
收藏 0 赞 0 分享

使用 Java 来调度定时任务时,我们经常会使用 Timer 类搞定。Timer 简单易用,在一些业务场景下用来实现简单定时调度。

Jave时间类库Timer简单使用

  1. 创建Timer对象
  2. 编写 自己的 task 类,该类集成 TimerTask,重写 run 方法,把要定时执行的逻辑写在里面
  3. 使用 Timer 执行 TimerTask
// 5秒后开始执行,每秒执行一次
Timer timer = new Timer();
timer.schedule(new TimerTask() {
    public void run() {
      System.out.println("hello world");
    }
}, 50000 , 1000);

Timer 里面的一些常用方法

经过delay(ms)后开始进行调度,仅仅调度一次。

public void schedule(TimerTask task, long delay)

在指定的时间点time上调度一次

public void schedule(TimerTask task, Date time)

在delay(ms)后开始调度,每次调度完后,最少等待period(ms)后才开始调度

public void schedule(TimerTask task, long delay, long period)

在到了指定时间后开始调度,每次调度完后,最少等待period(ms)后才开始调度。

public void schedule(TimerTask task, Date firstTime, long period)

在delay(ms)后开始调度,然后每经过period(ms)再次调度。

public void scheduleAtFixedRate(TimerTask task, long delay, long period)

schedule方法的区别在于:

schedule在计算下一次执行的时间的时候,是通过当前时间(在任务执行前得到) + 时间片,而scheduleAtFixedRate方法是通过当前需要执行的时间(也就是计算出现在应该执行的时间)+ 时间片,前者是运行的实际时间,而后者是理论时间点。比如:

  • schedule 时间片是 5s,那么理论上会在 5、10、15、20这些时间片被调度,但是如果由于某些 CPU 征用导致未被调度,假如等到第 8s 才被第一次调度,那么 schedule 方法计算出来的下一次时间应该是第 13s 而不是第 10s
  • scheduleAtFixedRate 方法就是每次理论计算出下一次需要调度的时间用以排序,若第8s被调度,那么计算出应该是第 10s,所以它距离当前时间是 2s

在到了指定时间后开始调度,每次调度完后,最少等待period(ms)后才开始调度。

public void scheduleAtFixedRate(TimerTask task, Date firstTime,long period)

内部结构

Timer 类里包含一个任务队列和一个异步轮询线程。任务队列里容纳了所有待执行的任务,所有的任务将会在这一个异步线程里执行,切记:

  • 任务的执行代码不可以抛出异常,否则会导致 Timer 线程挂掉,所有的任务都没得执行了。
  • **单个任务也不易执行时间太长,否则会影响任务调度在时间上的精准性。**比如你一个任务跑了太久,其它等着调度的任务就一直处于饥饿状态得不到调度。所有任务的执行都是这单一的 TimerThread 线程。
public class Timer {
  private final TaskQueue queue = new TaskQueue();
  private final TimerThread thread = new TimerThread(queue);
}

Timer 的任务队列 TaskQueue 是一个特殊的队列,它内部是一个数组。这个数组会按照待执行时间进行堆排序,堆顶元素总是待执行时间最小的任务。

更多关于Jave时间类库Timer的使用方法与实例请查看下面的相关链接

更多精彩内容其他人还在看

java 中maven pom.xml文件教程详解

这篇文章主要介绍了java 中maven pom.xml文件教程详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

spring boot整合netty的实现方法

这篇文章主要介绍了spring boot整合netty的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Netty与Spring Boot的整合实现

这篇文章主要介绍了Netty与Spring Boot的整合的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring动态加载bean后调用实现方法解析

这篇文章主要介绍了Spring动态加载bean后调用实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java实现画图板上画一条直线

这篇文章主要为大家详细介绍了java实现画图板上画一条直线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java通过python命令执行DataX任务的实例

今天小编就为大家分享一篇Java通过python命令执行DataX任务的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

springBoot集成redis的key,value序列化的相关问题

这篇文章主要介绍了springBoot集成redis的key,value序列化的相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

java实现登录案例

这篇文章主要为大家详细介绍了java实现登录案例的相关代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java解决请求跨域的两种方法

这篇文章主要为大家详细介绍了java解决请求跨域的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

SpringBoot集成Beetl后统一处理页面异常的方法

这篇文章主要介绍了SpringBoot集成Beetl后统一处理页面异常的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享
查看更多