JAVA timer的基本知识

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

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)

 1 /**
 2  * 第一种方法:设定多长时间(毫秒)后执行任务
 3  */
 4 public static void timer1() {
 5     final StopWatch watch = new StopWatch();
 6     watch.start();
 7     Timer timer = new Timer();
 8     /* void java.util.Timer.schedule(TimerTask task, long delay) */
 9     timer.schedule(new TimerTask() {
10         public void run() {
11             watch.stop();
12             System.out.println("-------任务执行--------");
13             System.out.println(watch.getTime());
14         }
15     }, 2000);// delay=2000毫秒 后执行该任务
16 }

(2)

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

(3)

 1 /**
 2  * 第三种方法:设定指定任务task在指定延迟delay后进行固定延迟peroid的执行
 3  */
 4 public static void timer3() {
 5     Timer timer = new Timer();
 6     final StopWatch watch = new StopWatch();
 7     watch.start();
 8     System.out.println(Thread.currentThread().getName());
 9     /*
10      * void java.util.Timer.schedule(TimerTask task, long delay, long
11      * period)
12      */
13     timer.schedule(new TimerTask() {
14         public void run() {
15             /* 子线程进行任务的执行 */
16             System.out.println(Thread.currentThread().getName());
17             System.out.println("-------设定要指定任务--------");
18             watch.suspend();
19             System.out.println(watch.getTime());
20             watch.reset();
21             watch.start();
22         }
23     }, 1000, 1000);
24 }

(4)

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

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)

 1 /**
 2  * 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行
 3  * 每天中午12点都执行一次
 4  */
 5 public static void timer4() {
 6     Calendar calendar = Calendar.getInstance();
 7     calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制时
 8     calendar.set(Calendar.MINUTE, 0); // 控制分
 9     calendar.set(Calendar.SECOND, 0); // 控制秒
10
11     Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00
12
13     Timer timer = new Timer();
14     /* void java.util.Timer.schedule(TimerTask task, Date firstTime, long period) */
15     timer.schedule(new TimerTask() {
16         public void run() {
17             System.out.println("-------设定要指定任务--------");
18         }
19     }, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行
20 }

(6)

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

JAVA timer的基本知识的相关文章

Java语言的基础知识

第三章 1.在java源文件编辑器中,选择某个成员变量,然后按住shift+alt+j,Eclipse会自动添加JavaDoc文档注释结构,如果选择的是方法,还会自动添加参数名称. 2.Java语言规定标示符是由任意的字母.下划线.美元符号和数字组成,并且第一个字符不能使数字,标示符不能使java中的保留关键字. 3.在Java语言中允许使用汉字或其他语言文字作为变量名,如int 年龄 =21;在程序运行时不会报错,但建议尽量不要使用这些语言作为变量. 4.java用关键字final来声明常量,

Java并发(基础知识)—— Executor框架及线程池

在Java并发(基础知识)—— 创建.运行以及停止一个线程中讲解了两种创建线程的方式:直接继承Thread类以及实现Runnable接口并赋给Thread,这两种创建线程的方式在线程比较少的时候是没有问题的,但是当需要创建大量线程时就会出现问题,因为这种使用方法把线程创建语句随意地散落在代码中,无法统一管理线程,我们将无法管理创建线程的数量,而过量的线程创建将直接使系统崩溃. 从高内聚角度讲,我们应该创建一个统一的创建以及运行接口,为我们管理这些线程,这个统一的创建与运行接口就是JDK 5的Ex

Java语言的基础知识4

第五章(数组) 1.在Java中可以将数组看做是一个对象虽然基本数据类型不是对象但有基本数据类型组成的数组是对象. 2.对于二维数组求第二维就用array[0].length, array.length就是默认的是第一维的长度. 3.foreach并不是一个新的语法它是for的循环的格式化主要执行遍历功能的循环,example: int arry ={1,2,3,4,5}; for(int i :array){ system.out.println(): } 4.数组元素定义完以后可通过Arra

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 I/O基础知识之I/O流

I/O流基础知识--字节流和字符流 文件存储在硬盘中,是以二进制表示的,只有内存中才能形成字符.数据的来源可以有硬盘,内存,控制台,网络,Java把数据从一个地方转到另一个地方的现象称为流,用InputStream和OutputStream接口来表示,这两个流里面的都是以字节为单位的,后来加入了Reader和Writer,里面操作的是字符,是两个字节为单位的. 字节流 字节流将数据写入文件 try { File file =new File("d:" +File .separator+

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

Java语言的基础知识12

第十四章(使用集合类保存对象) 1.java中得集合对象就像是一个容器,它用来存放Java类的对象.Java中的集合类有些方便存入和取出,有些则方便查找.集合类和数组的区别是,数组的长度是固定的,集合的长度是可变的,数组用来存放基本类型,集合用来存放对象的引用.常用的集合类有List集合,Set集合,和Map集合. 2.List集合包括List接口以及List接口的所有实现类.List集合中的元素许重复,个元素的顺序就是对象插入的顺序.类似java中的数组.List类继承了Collection接

Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解

原创整理不易,转载请注明出处:Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解 代码下载地址:http://www.zuidaima.com/share/1772648445103104.htm 有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz. 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; p