Timer定时器

本文深入解析Java中的定时任务实现机制,对比Timer与TimerTask的区别,详细介绍Timer的六种调度方法,包括一次性调度、周期性调度及固定速率调度,并探讨其在实际应用中的优劣。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Timer就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现.

Timer timer = new Timer();
timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("定时任务");
        }
}, 20*1000 , 1000);

//20s后开始执行,每秒执行一次

通过查看Timer的内部构造函数:

1. public void schedule(TimerTask task, long delay)
   调度一个task,经过delay(ms)后开始进行调度,仅仅调度一次。

2. public void schedule(TimerTask task, Date time)
   在指定的时间点time上调度一次。

3. public void schedule(TimerTask task, long delay, long period)
   调度一个task,在delay(ms)后开始调度,每次调度完后,最少等待period(ms)后才开始调度。

4. public void schedule(TimerTask task, Date firstTime, long period)
   和上一个方法类似,唯一的区别就是传入的第二个参数为第一次调度的时间。

5. public void scheduleAtFixedRate(TimerTask task, long delay, long period)
   调度一个task,在delay(ms)后开始调度,然后每经过period(ms)再次调度,貌似和方法:schedule是一样的,其实不然,schedule在计算下一次执行的时间的时候,是通过当前时间(在任务执行前得到) + 时间片,而scheduleAtFixedRate方法是通过当前需要执行的时间(也就是计算出现在应该执行的时间)+ 时间片,前者是运行的实际时间,而后者是理论时间点,例如:schedule时间片是5s,那么理论上会在5、10、15、20这些时间片被调度,但是如果由于某些CPU征用导致未被调度,假如等到第8s才被第一次调度,那么schedule方法计算出来的下一次时间应该是第13s而不是第10s,这样有可能下次就越到20s后而被少调度一次或多次,而scheduleAtFixedRate方法就是每次理论计算出下一次需要调度的时间用以排序,若第8s被调度,那么计算出应该是第10s,所以它距离当前时间是2s,那么再调度队列排序中,会被优先调度,那么就尽量减少漏掉调度的情况。

6. public void scheduleAtFixedRate(TimerTask task, Date firstTime,long period)
   第一次调度时间设置为一个Date时间,而不是当前时间的一个时间片.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值