java 定时器 Timer

本文通过实例介绍了Java中使用Timer类实现定时任务的方法,包括不同时间间隔的调度、指定时间点开始执行的任务等,并展示了如何创建自定义的定时任务。


import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
* 定时器 timer (功能有限,只能采用[秒数等]计算定时), 其他更好的工具 quartz ,spring scheduler
*/
public class TraditionalTimerTest {

static int count=0;
/**
* @param args
*/
public static void main(String[] args) {
//不写 3000,就只 1s钟后 开始爆炸
//写3000,就是1s后爆炸 然后隔 3s再炸下,循环
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("bombing!");
}
}, 1000,3000); //定时器 ,10后爆炸


//2s后 炸,然后 2s后 再炸 继续这样
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("bombing!");
new Timer().schedule(new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("bombing!");
}
}, 4000); //如果为2000 就是 2s 的循环爆炸, 如果为 4000 就是 2 s 4s 的交替 执行
}
}, 2000,6000); //定时器 ,10后爆炸


//另一种思路实现上面的 每隔2s 4s 4s 4s 连环 爆炸
class MyTimerTask extends TimerTask{
@Override
public void run() {
System.out.println("bombing!");
new Timer().schedule(new MyTimerTask(), 4000);
}
}
new Timer().schedule(new MyTimerTask(), 2000);


//另一种思路实现上面的 每隔2s 4s 2s 4s 连环 爆炸
class MyTimerTask1 extends TimerTask{
@Override
public void run() {
count=(count++)%2;
System.out.println("bombing!");
new Timer().schedule(new MyTimerTask1(), 2000+2000*count); //如果为2000 就是 2s 的循环爆炸, 如果为 4000 就是 2 s 4s 的交替 执行
}
}

//指定的时间 点 开始执行,然后 间隔 2s执行一次
Calendar cal=Calendar.getInstance();
cal.add(Calendar.SECOND, 10);
new Timer().schedule(new TimerTask(){

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("bombing!");
}

}, cal.getTime(), 2000);

//打印计时
while(true){
System.out.println(new Date().getSeconds());
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}

}
<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、付费专栏及课程。

余额充值