Timer无法启动:返回null是否存在问题?是否必须返回新的TimerTask实例?
关于Timer无法启动问题的分析与解决
嘿,我来帮你拆解下这个Timer启动失败的问题~
核心问题:返回null是直接诱因
首先明确说:是的,返回null就是导致Timer无法启动的直接原因。Timer.scheduleAtFixedRate()方法要求传入一个有效的TimerTask实例来执行定时逻辑,你传进去null的话,方法内部会抛出NullPointerException(可能你没在控制台看到这个异常,但它确实发生了,直接导致定时任务无法被正常调度)。
关于是否必须返回新TimerTask实例的问题
准确来说,你需要提供一个有效的TimerTask实例,不一定非要每次返回新的,但前提是这个实例是可用的(没有被取消、状态正常)。不过你的代码根本没创建TimerTask实例——原来的run()方法只是打印了"hello"就返回null,这才是核心问题,和是否返回新实例无关,你首先得有一个真正的TimerTask对象才行。
修正后的代码示例
你需要把run()方法改成返回一个真正的TimerTask实例,比如用匿名内部类实现:
package testing; import java.util.Timer; import java.util.TimerTask; public class myClass { public static TimerTask run() { // 返回一个真正的TimerTask实例,重写run方法定义任务逻辑 return new TimerTask() { @Override public void run() { System.out.println("hello."); } }; } public static void setTimer(int seconds) { Timer timerObject = new Timer(); timerObject.scheduleAtFixedRate(run(), 0, 1000); } public static void main(String args[]) { setTimer(1); } }
如果你的项目用的是Java 8及以上版本,还可以用更简洁的Lambda表达式写法:
public static TimerTask run() { return () -> System.out.println("hello."); }
额外说明
修改后,Timer就能正常启动,每隔1秒打印一次"hello"了。另外要注意:Timer是单线程调度的,如果任务执行时间超过间隔时间,会出现任务堆积的情况;如果需要更灵活的定时任务调度,也可以考虑用ScheduledExecutorService替代Timer,它的性能和可靠性更好哦~
内容的提问来源于stack exchange,提问作者bzix
相关产品推荐
相关产品推荐

