请解释Java中的Timer类,说明其工作原理、主要方法、局限性以及适用场景。
考察说明
考察对Java定时任务基础组件Timer的理解,包括使用方式、内部机制及限制。
回答思路
- 【回答框架 1】Timer是Java提供的定时任务调度工具,基于单线程执行任务。它内部维护一个TaskQueue和TimerThread,通过Object.wait和notify机制管理任务触发,但核心调度依赖系统时钟。
- 【回答框架 2】常用方法包括schedule(TimerTask, long delay)和schedule(TimerTask, Date firstTime, long period),可执行一次或周期性任务,另有scheduleAtFixedRate用于固定频率调度。
- 【回答框架 3】Timer的局限性在于单线程串行执行,若一个任务耗时过长会延迟后续任务;且任务抛出未捕获异常会终止整个Timer,导致所有任务取消。
- 【回答框架 4】Java 5后推荐使用ScheduledThreadPoolExecutor替代Timer,因其支持多线程、更灵活且异常隔离。
- 【关键点 1】Timer基于单线程和二叉堆任务队列,适合简单延迟或固定周期任务。
- 【关键点 2】schedule与scheduleAtFixedRate的区别:前者按固定延迟调度,后者按固定频率调度。
- 【关键点 3】任务异常会导致Timer线程终止,影响其他任务。
- 【关键点 4】ScheduledThreadPoolExecutor是更健壮的替代方案。
- 【易错点 1】误以为Timer线程安全,实际单线程模型下不保证任务并发安全。
- 【易错点 2】忽略schedule和scheduleAtFixedRate的调度语义差异,导致时间偏差。
- 【易错点 3】未捕获异常导致Timer终止,可能造成任务静默丢失。