Wel*_*ite 2 java timer task long-integer
我有一个java.util.Timer,我正在安排在凌晨3:00:00每24小时运行一次的TimerTasks,但是在5-8天之后,GC消耗了Timer并且我的所有任务都被取消了,因为定时器实例不再存在.
我怎么能阻止这个?
我用:
t.schedule(timerTask, date);
Run Code Online (Sandbox Code Playgroud)
然后任务再次启动(执行任务时也是调用此任务的调用方法)
计时器定义如下:
public static Timer t = new java.util.Timer();
Run Code Online (Sandbox Code Playgroud)
如果Timer声明并创建如下:
public static Timer t = new java.util.Timer();
Run Code Online (Sandbox Code Playgroud)
那么我认为只有两种场景Timer可以收集垃圾:
在应用程序的某处,某些东西正在为其分配一个新值t,导致之前的值无法访问.
包含t声明的类已无法访问且已卸载.
第一种情况是最有可能的,并且有一种简单的方法可以避免它.将声明更改为:
public static final Timer t = new java.util.Timer();
Run Code Online (Sandbox Code Playgroud)
如果您的应用程序(或者它正在使用的框架)使用本身变得无法访问的类加载器动态加载类,则第二种情况是合理的.