java定时器 Timer

本文介绍如何使用Java的Timer类实现定时任务,并详细解释了Timer类的主要方法。此外,还介绍了Servlet 2.3版本引入的应用事件监听器,包括如何在web.xml中配置监听器。

java定时器 Timer

java定时器的使用(Timer)
1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。对于这样的操作最方便、高效的实现方式就是使用

java.util.Timer工具类。

private java.util.Timer timer;
timer = new Timer(true);
timer.schedule(
new java.util.TimerTask() { public void run() { //server.checkNewMail(); 要操作的方法 } }, 0, 5*60*1000);
      第一个参数是要操作的方法,第二个参数是要设定延迟的时间,第三个参数是周期的设定,每隔多长时间执行该操作。

    使用这几行代码之后,Timer本身会每隔5分钟调用一遍server.checkNewMail()方法,不需要自己启动线程。Timer本身也是多

线程同步的,多个线程可以共用一个Timer,不需要外部的同步代码。
2、
(1)Timer.schedule(TimerTask task,Date time)安排在制定的时间执行指定的任务。
(2)Timer.schedule(TimerTask task,Date firstTime ,long period)安排指定的任务在指定的时间开始进行重复的固定延迟执行.
(3)Timer.schedule(TimerTask task,long delay)安排在指定延迟后执行指定的任务.
(4)Timer.schedule(TimerTask task,long delay,long period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行.
(5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)安排指定的任务在指定的时间开始进行重复的固定

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

率执行. 

 

 

14 指定应用事件监听程序

应用事件监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版本2.3中的新内容。这里只简单地说明用来向Web应用注册一个监听程序的web.xml的用法。
注册一个监听程序涉及在web.xml的web-app元素内放置一个listener元素。在listener元素内,listener-class元素列出监听程序的完整的限定类名,如下所示:
<listener>
<listener-class>package.ListenerClass</listener-class>
</listener>
虽然listener元素的结构很简单,但请不要忘记,必须正确地给出web-app元素内的子元素的次序。listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。此外,因为应用生存期监听程序是serlvet规范的2.3版本中的新内容,所以必须使用 web.xml DTD的2.3版本,而不是2.2版本。
例如,程序清单5-20给出一个名为ContextReporter的简单的监听程序,只要Web应用的Servlet-Context建立(如装载Web应用)或消除(如服务器关闭)时,它就在标准输出上显示一条消息。程序清单5-21给出此监听程序注册所需要的web.xml文件的一部分。

程序清单5-20 ContextReporterjava
package moreservlets;

import javax.servlet.*;
import java.util.*;

/** Simple listener that prints a report on the standard output
* when the ServletContext is created or destroyed.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
*
http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class ContextReporter implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
System.out.println("Context created on " +
new Date() + ".");
}

public void contextDestroyed(ServletContextEvent event) {
System.out.println("Context destroyed on " +
new Date() + ".");
}
}


程序清单5-21 web.xml(声明一个监听程序的摘录)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<filter-mapping> … </filter-mapping>
<listener>
<listener-class>package.ListenerClass</listener-class>
</listener>
<servlet> ... </servlet>
<!-- ... -->
</web-app>

<think>首先,用户的问题是:“我想了解Java中的定时器Timer的用法或解决相关问题请问JavaTimer类使用方法示例代码定时任务”。这很清晰:用户想学习JavaTimer类如何用于定时任务,包括方法、示例代码和相关问题。回顾系统级指令:-使用$...$或$$...$$格式内数学表达式(但这里可能不适用,因为是Java代码)。-使用中文回答。-生成相关问题。-引用的段落末尾添加引用标识。-回答结构清晰,逐步解决问题。-参考用户的引用:引用[1]到[4]提供了关于JavaTimer的信息,包括示例代码、优缺点等。用户的引用:-[1]:展示了Timer的基本使用方法:创建Timer,定义TimerTask子类,使用schedule方法安排任务。-[2]:类似,展示了使用TimerExample,包括延迟和执行间隔。-[3]:总结了Timer类的使用。-[4]:提到TimerTask抽象类实现Runnable,支持多线程任务。用户的真实需求是JavaTimer类的使用方法和示例代码。所以,我的回答应该基于这些引用,提供简洁、准确的指导。**回答结构:**1.**介绍Timer类**:简要解释TimerTimerTask的作用。2.**核心方法**:列出关键方法,如schedule和scheduleAtFixedRate。3.**示例代码**:提供简单明了的代码示例。4.**注意事项**:讨论Timer的优缺点,如单线程问题、资源消耗。5.**生成相关问题**:基于主题生成相关问题。6.**引用标识**:末尾添加引用标识如[^1],指向用户提供的引用。确保回答是中文的。**关键内容提取:**-Timer类用于安排任务在指定时间后执行或定期执行。-TimerTask是抽象类,继承Runnable,定义任务逻辑。-方法:timer.schedule(task,delay,period)用于延迟后定期执行。-示例:如引用[1]和[2]所示。-优点:简单易用(引用[2])。-缺点:Timer是单线程的,如果一个任务延迟,会影响后续任务;可能导致资源泄露(引用[4]提到“消耗资源”)。**编写回答大纲:**1.**开头:**回应用户需求,介绍主题。2.**主要部分:**-Timer类概述。-关键方法解释。-步骤指南:如何创建定时任务。-完整示例代码。-注意事项。3.**结尾:**生成相关问题。**生成相关问题:**需要创建几个相关问题,例如:-Timer的线程安全问题?-替代方案如ScheduledExecutorService?-如何处理TimerTask的异常?-Timer的cancellation方法?-实际应用场景?**引用标识:**在回答中,如果直接引用内容,末尾添加[^数字],但用户说“上述引用仅供参考”,所以我不能直接复制,但基于它们构建回答。结束时加上引用。现在,草拟回答:</think> ### JavaTimer类使用详解 Java的`java.util.Timer`类和`java.util.TimerTask`是实现定时任务的简单方案。Timer类允许您安排任务在指定延迟后执行一次或定期重复执行,而TimerTask是一个抽象类,实现了Runnable接口,用于定义具体任务逻辑。下面我将基于用户提供的引用内容[^1][^2][^3][^4],逐步解释其用法,包括核心方法、示例代码和注意事项。整个讲解结构清晰,确保内容真实可靠。 #### 1. Timer类和TimerTask的基本概念 - **Timer类**:用于创建定时器,通过其schedule或scheduleAtFixedRate方法安排任务执行。 - **TimerTask类**:一个抽象类,需要您覆盖其run()方法定义任务逻辑(TimerTask实现Runnable接口)。 - **线程模型**:Timer使用单一后台线程(由Timer对象维护)执行所有安排的任务。这意味着如果多个任务被安排,它们会按顺序执行;如果某个任务运行时间过长,会影响后续任务的调度[^4]。 #### 2. 核心方法说明 Timer类的关键方法如下: - **schedule(TimerTask task, long delay)**:安排任务在指定`delay`毫秒后执行一次。 - **schedule(TimerTask task, Date time)**:安排任务在特定时间`time`执行一次。 - **schedule(TimerTask task, long delay, long period)**:安排任务在`delay`毫秒后执行,然后每隔`period`毫秒重复执行(任务执行时间可能因前一个任务延迟而漂移)。 - **scheduleAtFixedRate(TimerTask task, long delay, long period)**:类似schedule,但更强调固定速率:从第一次执行后,每隔`period`毫秒执行,无论前一个任务是否延迟(更适合周期稳定性要求高的场景)[^2][^3]。 #### 3. 使用步骤和示例代码 以下是创建一个简单定时任务的完整步骤和代码示例。基于引用[^1][^2],我将提供详细的Java代码。 **步骤:** 1. **定义TimerTask子类**:创建一个继承TimerTask的类,覆盖run()方法编写任务逻辑。 2. **实例化Timer**:创建一个Timer对象。 3. **安排任务**:使用Timer的schedule或scheduleAtFixedRate方法指定延迟和间隔。 4. **处理异常和取消**:注意添加异常处理,避免任务错误导致Timer崩溃。 **完整示例代码:** ```java import java.util.Timer; import java.util.TimerTask; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class TimerExample { // 定义时间格式化工具 private static String getCurrentTime() { return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } public static void main(String[] args) { // 1. 创建Timer实例 Timer timer = new Timer(); // 2. 创建TimerTask任务(使用匿名类方式) TimerTask task = new TimerTask() { @Override public void run() { try { // 任务逻辑:打印当前时间 System.out.println(getCurrentTime() + " - 定时任务已执行!"); // 假设这里可以是其他代码,如文件清理或数据同步 } catch (Exception e) { System.err.println(getCurrentTime() + " - 任务出错: " + e.getMessage()); } } }; // 3. 安排任务:延迟1秒后执行,然后每2秒重复执行 System.out.println(getCurrentTime() + " - Timer启动"); timer.schedule(task, 1000, 2000); // 参数任务对象,延迟(毫秒),间隔(毫秒) // 可选:如果需要固定速率,使用scheduleAtFixedRate // timer.scheduleAtFixedRate(task, 1000, 2000); // 4. 示例:运行一段时间后取消定时器(防止程序无限运行) try { Thread.sleep(10000); // 让主线程休眠10秒 } catch (InterruptedException e) { e.printStackTrace(); } timer.cancel(); // 取消Timer所有任务 System.out.println(getCurrentTime() + " - Timer已取消"); } } ``` **代码说明:** - 本示例使用匿名类定义TimerTask,run()方法内打印当前时间,模拟定时执行的任务。 - `timer.schedule(task, 1000, 2000)`表示:延迟1000毫秒(1秒)后首次执行,然后每2000毫秒(2秒)重复执行。 - 添加了异常处理和Timer的取消逻辑,以防止资源泄露。 - 您可以根据需求选择schedule或scheduleAtFixedRate方法(引用[2]中讨论了二者的区别)[^1][^2]。 #### 4. 注意事项和优缺点 - **优点**: - **简单易用**:无需额外库,Java标准库自带,适合轻量级定时需求[^2]。 - **轻量线程**:TimerTask通过单一后台线程执行,减少了多线程复杂性(如果任务简单)。 - **缺点和问题**: - **单线程风险**:Timer只有一个线程;如果一个任务阻塞或运行时间过长,其他任务会被延迟或积压(可能导致时间漂移或不及时执行)[^4]。 - **资源消耗**:Timer实例会创建守护线程,如果不主动取消(timer.cancel()),可能造成内存泄露或后台线程挂起[^4]。 - **异常处理**:TimerTask的run()方法中未捕获异常会导致Timer线程终止,所有任务停止;因此必须在run()中添加try-catch块[^3]。 - **替代方案**:对于高要求场景(如多任务并发),推荐使用`java.util.concurrent.ScheduledExecutorService`(它基于线程池,更灵活高效)[^4]。 - **实际建议**:适合用于简单的后台任务,如周期性日志打印、数据刷新或短时间运行的定时操作;避免用于关键系统定时[^3][^4]。 #### 5. 常见问题解决 - **如何取消任务?** 调用TimerTask.cancel()或Timer.cancel()。 - **如何避免时间漂移?** 使用scheduleAtFixedRate而非schedule。 - **如何处理多任务?** Timer支持多个TimerTask,但需注意单线程限制;对于并行需求,改用ScheduledExecutorService。 Java Timer类是定时任务入门的好工具,但需谨慎使用以防潜在问题[^1][^2][^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值