JAVA定时器运行状态确认

来源:百度知道 编辑:UC知道 时间:2024/06/20 09:00:07
环境:jdk6U13 + tomcat 6.0.18
目的:服务器每天晚上定时做一个处理
问题:
1。想知道有没办法可以监视这个定时器的运行状态。类似Thread里有个isAlive。
2。TimerTask实现了接口Runnable,他是做为一个单独的线程运行的吗?如果想测试这个定时器被异常中止有什么办法吗?是不是只要JVM不停,这个定时器就是一定在运行中呢。

在网上有看到一篇《封装的定时器类》可是系统已经在测试段了,在不增加新的类的情况下有办法可以做到吗?

谢谢。
---
//在LoadOnStartupServlet时调用
Timer timer = new Timer();
timer.schedule(new WorkTask(), firstTime, 86400000);
---
可能我说的不清楚,主要是为了防止计时器被异常中止了,系统不知道。所以单独有写一个Servlet来及时提供系统现在运行状态的。所以只是写日志可能没什么用处。

附加一个问题, 同一个tomcat里,在一个工程里运行了System.gc 的话,别的工程里的对像会不会也被清理掉呢?

问题一:定时器一般是以线程的方式运行的,如果能得到该线程的引用,就可以像查看Thread一样查看定时器的运行状态。如果可以修改源代码的话最好给他提供一个方法返回线程引用

问题二:TimerTask实现了接口Runnable,如果是以new Thread(TimerTask).start()方式启动的话就是做为一个单独的线程运行的,如果是timeTask.run()那就是方法调用,虽然占据一个线程,但这个线程就是主线程,并没有启动新的线程;既然实现线程,自然可以通过Thread的isAlive方法获取其live状态;一般情况下(不发生异常),定时器会一直运行,如果JVM停止,那么线程必然已经终止,如果JVM中只有这一个线程在运行,那么JVM不停,这个定时器就是一定在运行中,如果JVM中还有其他线程在运行,那么JVM不停,这个定时器有可能已经终止

PS:无论用不用线程池,线程启动方式只有两种(不包含main Thread):一种是继承Thread类,然后直接同构引用调用start方法,第二种就是继承Runnable接口,通过new Thread(new MyRunnableClass()).start()方式启动。无论如何,都会有一个Thread类的引用

补充:
一个tomcat只启动一个进程,而JVM的垃圾处理器也只有一个,所以在一个工程里运行System.gc也会影响到其他工程。

做一个进程自动检测不就好了

日志记录下 不行吗