jdk自带定时器使用方法详解

 更新时间:2017年06月28日 10:54:56   作者:ToBeABetterPerson  
这篇文章主要为大家详细介绍了jdk自带定时器的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

首先看一下jdk自带定时器:

一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。

schedule(TimerTask task,long delay) 安排在指定延迟后执行指定的任务。
schedule(TimerTask task,Date time) 安排在指定的时间执行指定的任务。如果此时间已过去,则安排立即执行该任务。
schedule(TimerTask task, long delay, long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟
schedule(TimerTask task,Date firstTime,long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。

package test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 * jdk自带定时器
 * 
 * @author LIUTIE
 *
 */
public class JDKTimer {
  

  public static void main(String[] args) throws ParseException {
    //日期格式工具
    final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    Timer timer = new Timer();
    // 10s后执行定时器,仅执行一次
    System.out.print(sdf.format(new Date()));
    System.out.println("the timer one will be executed after 10 seconds...");
    long milliseconds = 10 * 1000;
    timer.schedule(new TimerTask() {

      @Override
      public void run() {
        System.out.print(sdf.format(new Date()));
        System.out.println("the timer one has finished execution");
      }
    }, milliseconds);
    
    //12秒后执行定时器,每1s执行一次
    System.out.print(sdf.format(new Date()));
    System.out.println("the timer two will be executed after 12 seconds...");
    //启动后延迟时间
    long afterSs = 12 * 1000;
    //执行周期
    long intervalSs1 = 1 * 1000;
    timer.schedule(new TimerTask() {
      // 执行计数器
      int i = 0;

      @Override
      public void run() {
        System.out.print(sdf.format(new Date()));
        System.out.println("the timer two has execution " + (++i) + " timers");
        // 执行10次后关闭定时器
        if (i == 10) {
          this.cancel();
        }
      }
    }, afterSs, intervalSs1);
    
    
    // 指定时间执行定时器,仅执行一次
    System.out.print(sdf.format(new Date()));
    System.out.println("the timer three will be executed at 2017-06-27 21:47:00...");
    Date date = sdf.parse("2017-06-27 21:47:00");
    timer.schedule(new TimerTask() {

      @Override
      public void run() {
        System.out.print(sdf.format(new Date()));
        System.out.println("the timer three has finished execution");
      }
    }, date);
    
    // 从指定时间开始周期性执行
    System.out.print(sdf.format(new Date()));
    System.out.println("the timer four will be executed at 2017-06-27 21:48:00...");
    // 执行间隔周期
    long intervalSs = 1 * 1000;
    // 开始执行时间
    Date beginTime = sdf.parse("2017-06-27 21:48:00");
    timer.schedule(new TimerTask() {
      // 执行计数器
      int i = 0;

      @Override
      public void run() {
        System.out.print(sdf.format(new Date()));
        System.out.println("the timer four has execution " + (++i) + " timers");
        // 执行10次后关闭定时器
        if (i == 10) {
          this.cancel();
        }
      }
    }, beginTime, intervalSs);
  }

}

执行结果

2017-06-27 21:46:24the timer one will be executed after 10 seconds...
2017-06-27 21:46:24the timer two will be executed after 12 seconds...
2017-06-27 21:46:24the timer three will be executed at 2017-06-27 21:47:00...
2017-06-27 21:46:24the timer four will be executed at 2017-06-27 21:48:00...
2017-06-27 21:46:34the timer one has finished execution
2017-06-27 21:46:36the timer two has execution 1 timers
2017-06-27 21:46:37the timer two has execution 2 timers
2017-06-27 21:46:38the timer two has execution 3 timers
2017-06-27 21:46:39the timer two has execution 4 timers
2017-06-27 21:46:40the timer two has execution 5 timers
2017-06-27 21:46:41the timer two has execution 6 timers
2017-06-27 21:46:42the timer two has execution 7 timers
2017-06-27 21:46:43the timer two has execution 8 timers
2017-06-27 21:46:44the timer two has execution 9 timers
2017-06-27 21:46:45the timer two has execution 10 timers
2017-06-27 21:47:00the timer three has finished execution
2017-06-27 21:48:00the timer four has execution 1 timers
2017-06-27 21:48:01the timer four has execution 2 timers
2017-06-27 21:48:02the timer four has execution 3 timers
2017-06-27 21:48:03the timer four has execution 4 timers
2017-06-27 21:48:04the timer four has execution 5 timers
2017-06-27 21:48:05the timer four has execution 6 timers
2017-06-27 21:48:06the timer four has execution 7 timers
2017-06-27 21:48:07the timer four has execution 8 timers
2017-06-27 21:48:08the timer four has execution 9 timers
2017-06-27 21:48:09the timer four has execution 10 timers

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java控制结构知识点详解

    Java控制结构知识点详解

    在本篇文章里小编给大家分享的是关于Java控制结构知识点详解,有需要的朋友们可以参考下。
    2019-10-10
  • Java结构型设计模式之适配器模式详解

    Java结构型设计模式之适配器模式详解

    适配器模式,即将某个类的接口转换成客户端期望的另一个接口的表示,主要目的是实现兼容性,让原本因为接口不匹配,没办法一起工作的两个类,可以协同工作。本文将通过示例详细介绍适配器模式,需要的可以参考一下
    2022-09-09
  • IntelliJ IDEA(2019)安装破解及HelloWorld案例(图文)

    IntelliJ IDEA(2019)安装破解及HelloWorld案例(图文)

    这篇文章主要介绍了IntelliJ IDEA(2019)安装破解及HelloWorld案例(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 浅谈JAVA如何生成UUID唯一标识

    浅谈JAVA如何生成UUID唯一标识

    这篇文章主要介绍了浅谈JAVA如何生成UUID唯一标识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • SpringBoot利用限速器RateLimiter实现单机限流的示例代码

    SpringBoot利用限速器RateLimiter实现单机限流的示例代码

    本文主要介绍了SpringBoot利用限速器RateLimiter实现单机限流的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java排序算法之堆排思想及代码实现

    Java排序算法之堆排思想及代码实现

    今天小编就为大家分享一篇关于Java排序算法之堆排思想及代码实现,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • java String拼接json的方式实现

    java String拼接json的方式实现

    本文主要介绍了java String拼接json的方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • Spring Boot启动时调用自己的非web逻辑

    Spring Boot启动时调用自己的非web逻辑

    在spring Boot中,有些代码是WEB功能,例如API等,但是有些逻辑是非WEB,启动时就要调用并持续运行的,该如何加载自己的非WEB逻辑呢,下面通过实例代码给大家讲解,一起看看吧
    2017-07-07
  • Mybatis传递多个参数的解决办法(三种)

    Mybatis传递多个参数的解决办法(三种)

    这篇文章主要介绍了Mybatis传递多个参数的解决办法(三种),个人觉得第三种解决办法比较好用,有需要的朋友一起学习吧
    2016-05-05
  • 详解MyBatisPlus逻辑删除与唯一索引冲突问题

    详解MyBatisPlus逻辑删除与唯一索引冲突问题

    这篇文章主要介绍了详解MyBatisPlus逻辑删除与唯一索引冲突问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论