「其他」Timer定时器的使用
在开发过程中,经常性需要一些定时或者周期性的操作。而在Java中则使用Timer对象完成定时计划任务功能。
定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以Timer对象一般又和多线程技术结合紧密。
由于Timer是Java提供的原生Scheduler(任务调度)工具类,不需要导入其他jar包,使用起来方便高效,非常快捷。
Timer定时器应用场景
我们使用Timer定时器的时候,一般有4种情况,同时对应如下四种方法,且方法返回值都为void。
在指定的时间执行任务
指定时间启动任务,执行后间隔指定时间重复执行任务
启动任务之后,延迟多久时间执行
启动任务后,延迟多久时间执行,执行之后指定间隔多久重复执行任务
Timer四种方法的使用
- 继承 TimerTask 类 并实现 其中的run() 方法来自定义要执行的任务(还可以写成匿名内部类形式)
- 创建一个Timer类定时器的对象,并通过Timer.schedule(参数) 方法执行时间运行任务
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TestTimer {
public static void main(String[] args) {
//testTimer1();
testTimer2();
//testTimer3();
//testTimer4();
}
//方法一:设定指定任务task在指定时间time执行 schedule(TimerTask task, Date time)
public static void testTimer1() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------任务执行--------");
}
}, 3500);
// 设定指定的时间time为3500毫秒
}
/**
* 方法二:设定指定任务task在指定延迟delay后间隔指定时间period执行
* schedule(TimerTask task, long delay, long period)
*/
public static void testTimer2() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------任务执行--------");
}
}, 2000, 3500);
}
/**
* 方法三:设定指定任务task在指定延迟delay后进行固定频率peroid的执行。
* scheduleAtFixedRate(TimerTask task, long delay, long period)
*/
public static void testTimer3() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("-------任务执行--------");
}
}, 1000, 2000);
}
/**
* 方法四:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行.
* Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
*/
public static void testTimer4() {
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(); //获取当前系统时间
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("-------任务执行--------");
}
}, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行
}
}
Timer类注意事项
1. 创建一个 Timer 对象相当于新启动了一个线程,但是这个新启动的线程,并不是守护线程。它一直在后台运行,通过如下代码将新启动的 Timer 线程设置为守护线程。
private static Timer timer=new Timer(true);
2. 提前:当计划时间早于当前时间,则任务立即被运行。
3. 延迟:TimerTask 是以队列的方式一个一个被顺序运行的,所以执行的时间和你预期的时间可能不一致,因为前面的任务可能消耗的时间较长,则后面的任务运行的时间会被延迟。延迟的任务具体开始的时间,就是依据前面任务的"结束时间"。
4. 周期性运行:Timer.schedule(TimerTask task,Date firstTime,long period) 从 firstTime 开始每隔 period 毫秒执行一次任务。
5. schedule(TimerTask task,long delay) 当前的时间为参考时间,在此时间基础上延迟制定的毫秒数后执行一次TimerTask任务。
6. schedule(TimerTask task,long delay,long period) 当前的时间为参考时间,在此基础上延迟制定的毫秒数,再以某一间隔时间无限次数地执行某一任务。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2021-08-08 浅谈Spring的事务隔离级别和事务传播机制
2021-08-08 Spring如何保证事务获取到的是同一个Connection连接(Spring的事务同步机制)
2021-08-08 Spring事务_数据库连接和Java线程的关系