Java定时任务Timer调度器【三】 注意事项(任务精确性与内存泄漏)

本文探讨了Java定时任务Timer调度器在任务精确性和内存泄漏方面的问题。由于Timer的单线程特性,任务执行可能不准确,解决方案是在线程中异步执行任务,但这可能导致系统资源限制和内存溢出。此外,取消任务后,失效任务未被及时清理,可能导致内存泄漏。为解决这个问题,文章建议使用Timer的purge()方法来清除无效任务。

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

一、任务精确性

通过前两节的分析,大概知道了Timer的运行原理,下面说说使用Timer需要注意的一些事项。下面是Timer简单原理图

从上图可以看到,真正运行闹钟的是一个单线程。也就是说队列中的闹钟,只能依次进行串行化的操作,闹钟的定时执行得不到保证。

 

比如下面的例子(本节所有代码只列出关键部分,下同)。

public class ScheduleDemo {

    public static void main(String[] args) throws Exception {
        Timer timer = new Timer();
        timer.schedule(new AlarmTask("闹钟"),1000,2000);
    }

    static class AlarmTask extends TimerTask {
        public void run() {
            log.info(new Date() +" 嘀。。。");
            Thread.sleep(10_000); //模拟闹钟执行时间
        }
    }
}

从下面的运行结果可以看到,预期2秒以后运行的闹钟,推迟到了10秒以后。

Fri Nov 16 14:49:39 CST 2018 嘀。。。
Fri Nov 16 14:49:49 CST 2018 嘀。。。

 下面是闹钟运行的时序图

解决方法

针对上面的情况,用户可在AlarmTask.run()里面再开一个异步线程,让TimerThread及时返回,执行队列中后续的闹钟。

public class ScheduleDemo {

    public static void main(String[] args) throws Exception {
        Timer timer = new Timer();
        timer.schedule(new AlarmTask("闹钟"),1000,2000);
    }

    static class AlarmTask extends TimerTask{
        static ExecutorService threadPool = Executors.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值