java Timer 使用小结

Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务。这种方式可以让程序按照某一个频度执行,但不能指定时间运行。用的较少。

任务的调用通过起的子线程进行执行。

java.util.Timer

java.util.TimerTask

一、调用方法:

(1)void java.util.Timer.schedule(TimerTask task, long delay):多长时间(毫秒)后执行任务

(2)void java.util.Timer.schedule(TimerTask task, Date time):设定某个时间执行任务

(3)void java.util.Timer.schedule(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(4)void java.util.Timer.schedule(TimerTask task, Date firstTime, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

(5)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(6)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

void java.util.Timer.cancel():终止该Timer

boolean java.util.TimerTask.cancel():终止该TimerTask

可以为每个Timer指定多个TimerTask

虽然可通过void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)方法完成“例如:每天上午10点执行一次”的业务,但该实现是基于进行一天(1000 * 60 * 60 * 24毫秒)进行延迟的机制实现的,并不是指定某个具体时间进行执行的。

对于该种需求,可通过Quartz来进行实现

二、方法名称schedule()和scheduleAtFixedRate()两者的区别

当需要根据period区间时间循环多次调用任务的时候,会存在两种不同的策略,两种方法提供了不同的策略。

调用方法(1)、(2)只是单次执行,不存在多次调用任务的情况,所以没有提供scheduleAtFixedRate方法的调用方式。

<1>schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次
<2>scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period

三、示例

(1)

/**
 * 第一种方法:设定多长时间(毫秒)后执行任务
 */
public static void timer1() {
    final StopWatch watch = new StopWatch();
    watch.start();
    Timer timer = new Timer();
    /* void java.util.Timer.schedule(TimerTask task, long delay) */
    timer.schedule(new TimerTask() {
        public void run() {
            watch.stop();
            System.out.println("-------任务执行--------");
            System.out.println(watch.getTime());
        }
    }, 2000);// delay=2000毫秒 后执行该任务
}  

(2)

/**
 * 第二种方法:设定某个时间执行任务
 */
public static void timer2() {
    Calendar calendar = new GregorianCalendar();
    calendar.add(Calendar.MINUTE, 1);
    calendar.set(Calendar.SECOND, 0); // 一分钟后执行
    Timer timer = new Timer();
    /* void java.util.Timer.schedule(TimerTask task, Date time) */
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("-------任务执行--------");
        }
    }, calendar.getTime());
}

  

(3)

/**
 * 第三种方法:设定指定任务task在指定延迟delay后进行固定延迟peroid的执行
 */
public static void timer3() {
    Timer timer = new Timer();
    final StopWatch watch = new StopWatch();
    watch.start();
    System.out.println(Thread.currentThread().getName());
    /*
     * void java.util.Timer.schedule(TimerTask task, long delay, long
     * period)
     */
    timer.schedule(new TimerTask() {
        public void run() {
            /* 子线程进行任务的执行 */
            System.out.println(Thread.currentThread().getName());
            System.out.println("-------设定要指定任务--------");
            watch.suspend();
            System.out.println(watch.getTime());
            watch.reset();
            watch.start();
        }
    }, 1000, 1000);
}

  

(4)

/**
 * 固定延迟peroid时间后执行;peroid时间不是以任务执行完的时间为计算起点(某次任务执行完成后,经过peroid时间后再次调用[不是这样的])。
 * 而是每隔peroid时间调用任务一次。当任务执行的时间小于peroid时间,可以保证每隔peroid时间调用一次。
 * 当任务的执行时间大于peroid时间时,从现象上看:任务一执行完,就会立刻进入下一次任务的执行
 */
public static void timer3a() {
    Timer timer = new Timer();
    final StopWatch watch = new StopWatch();
    watch.start();
    timer.schedule(new TimerTask() {
        Integer i = 1;
        public void run() {
            System.out.println(watch.getTime());
            System.out.println("########第" + i + "次执行开始########");
            try {
                Thread.sleep(400);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("########第" + i + "次执行结束########");
            i++;
            watch.reset();
            watch.start();
        }
    }, 1000, 500);
}

  

period:500毫秒;每次任务执行时间400毫秒;所以每次任务执行完成后到下一次任务调用开始的时间趋近于100毫秒

打印日志信息:

  1. 1000
  2. ########第1次执行开始########
  3. ########第1次执行结束########
  4. 109
  5. ########第2次执行开始########
  6. ########第2次执行结束########
  7. 93
  8. ########第3次执行开始########
  9. ########第3次执行结束########
  10. 93
  11. ########第4次执行开始########
  12. ########第4次执行结束########
  13. 93
  14. ########第5次执行开始########
  15. ########第5次执行结束########
  16. 93
  17. ########第6次执行开始########
  18. ########第6次执行结束########
  19. 93
  20. ########第7次执行开始########
  21. ########第7次执行结束########
  22. 93
  23. ########第8次执行开始########

当将Thread.sleep(400);修改为Thread.sleep(600)时:

打印日志信息:

  1. 1000
  2. ########第1次执行开始########
  3. ########第1次执行结束########
  4. 0
  5. ########第2次执行开始########
  6. ########第2次执行结束########
  7. 0
  8. ########第3次执行开始########
  9. ########第3次执行结束########
  10. 0
  11. ########第4次执行开始########
  12. ########第4次执行结束########
  13. 0
  14. ########第5次执行开始########

(5)

/**
 * 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行
 * 每天中午12点都执行一次
 */
public static void timer4() {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制时
    calendar.set(Calendar.MINUTE, 0); // 控制分
    calendar.set(Calendar.SECOND, 0); // 控制秒  

    Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00  

    Timer timer = new Timer();
    /* void java.util.Timer.schedule(TimerTask task, Date firstTime, long period) */
    timer.schedule(new TimerTask() {
        public void run() {
            System.out.println("-------设定要指定任务--------");
        }
    }, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行
}  

(6)

/**
 * 第五种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行。
 * timer.schedule和timer.scheduleAtFixedRate的区别:
 * (1)schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次
 * (2)scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period
 */
public static void timer5() {
    Timer timer = new Timer();
    /* void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period) */
    timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            System.out.println("-------设定要指定任务--------");
        }
    }, 1000, 500);
}  

转:http://blog.csdn.net/eg366/article/details/11836017

时间: 2024-10-30 22:34:39

java Timer 使用小结的相关文章

Java定时任务:利用java Timer类实现定时执行任务的功能

一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务. TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务,具体要执行的代码写在TimerTask需要被实现的run方法中. 二.先看一个最简单的例子 我们通过代码来说明 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

java对象序列化小结

百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据.确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission.在默认策略下,通过 Internet 下载

SAE Java相关问题小结

转自:http://blog.csdn.net/bhq2010/article/details/8580412 Sae中使用的servlet容器是jetty7.4.x 我想在web.xml中配置一个自己编写的servlet,实现web启动时的初始化工作,但是总是出现各种问题,下面总结了一下在sae中使用java的一些注意事项: 1.在eclipse中开发java web项目时,我总喜欢直接把需要的jar包复制到WEB-INF/lib下,但在开发sae项目时,最好把需要的jar包放到usr lib

java单向加密算法小结(1)--Base64算法

java单向加密算法小结(1)--Base64算法 从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间是使用字节流的方式进行传递的,所有的信息都要最终转换为0101的二进制,这本身就涉及到编码,解码的应用. Base64,顾名思义,是使用了64个基本的字符来对任意数据进行编码的一种实现方式,那既然有Base64,是不是也有Base32,Base16

java集合框架小结(进阶版)之HashMap篇

基本概念: Hash(哈希):hash一般也译作“散列”.事实上,就是一个函数,用于直接定址.将数据元素的关键字key作为变量,通过哈希函数,计算生成该元素的存储地址. 冲突:函数是可以多对一的.即:多个自变量可以映射到同一函数值.一般而言,不同的key的hash值是不同的.在往hash表中映射的时候,不同的hash值可能映射到同一存储地址,这种情况被称为冲突. 解决冲突的方法: 1. 链表法:将冲突的各个元素用一个一维数组来维护.(java源码实现) 2. 开发寻址法:具体的有线性探测法.二次

java集合框架小结(进阶版)之HashSet篇

建议先看下:java集合框架小结(进阶版)之HashMap篇 基本概念: hashSet: 根据java集合框架小结(初级版)图示,HashSet是AbstractSet的一个子类,是基于Hash算法的Set接口的实现,顾名思义.允许添加null. --------------------------------------↑ 以上都是扯淡 ↑,↓ HashSet完全是在挂羊头卖狗肉 ↓------------------------------------------- 何谓挂羊头卖狗肉?大家

Java Timer

package job; import java.util.Timer; import java.util.TimerTask; public class TimerTest { public static void main(String[] args) { Timer timer = new Timer(); //在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务 timer.schedule(new MyTask(), 1000, 2000);

java Timer定时器管理类

1.java timer类,定时器类.启动执行定时任务方法是timer.schedule(new RemindTask(), seconds*1000);俩参数分别是TimerTask子类,具体执行定时操作所执行的动作,后一个参数是豪秒,代表间隔多久执行一次.2.TimerTask类,java.util.TimerTask,具体定时执行的操作.里面有个run方法,和线程run方法一样(就是线程).5.Timer是一种定时器工具,用来在一个后台线程计划执行指定任务.它可以计划执行一个任务一次或反复

Java Timer触发定时器

XML: <!-- Java Timer定时 --> <!-- <bean id="shortUrlTask" class=" com.spring.common.ShortUrlTask"> </bean> <bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTas