请教线程监控的问题

来源:百度文库 编辑:神马文学网 时间:2024/05/01 18:06:12
在一个多线程的环境下,有10个Timer,TimeTask线程在运行,现在希望写一个监控线程来监控这10个线程是否仍然还在(我的意思是可能其中的某个Timer线程因为某鞋原因当掉了,再也起不来,那么就只有9个Timer在跑了)。这个监控线程应该怎么写呢,如何才能知道还剩下几个线程在跑?请!
--------------------------------------
让每个线程定期来报到吧,超时不到者,杀!
-------------------------------------
你自己实现一个 ThreadGroup, 重载它的 ExceptionHandler, 然后那些线程都构造为从属于这个 ThreadGroup, 这样它们如果发生异常, 就会调用你的 ExceptionHandler, 你也就知道它们出问题了.
通常情况下线程如果不出异常, 都是在正常运行. 如果出了异常也没有通知你的Handler, 那就很可能是整个JVM都崩溃了, 也不可能再执行其他维护逻辑了. 所以这个路子应该能满足现实要求.
------------------------------------
谢谢楼上
ThreadGroup我也考虑过,但有两个问题,一方面ThreadGroup在Java中并不是很成功,另外还有一个重要的问题是我的线程是Timer(项目规定),不是Thread,Thread在构造函数的时候可以指定ThreadGroup,但是Timer并没有这样的构造函数,我不知道如何把Timer归进一个ThreadGroup。
另外请问楼上你所谓的重载ExceptionHander是在什么地方重载,不是很明白,谢谢
------------------------------------
重载 [url]http://java.sun.com/javase/6/docs/api/java/lang/ThreadGroup.html#uncaughtException(java.lang.Thread, java.lang.Throwable)[/url] 可以捕获线程的异常.
哦, 才发现 1.5 以后可以给 Thread 直接设置 UncaughtExceptionHandlerhttp://java.sun.com/javase/6/docs/api/java/lang/Thread.html#setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler) 了.
另外看了一下 java.util.Timer, 似乎你要知道它是否正常运行的话, 可以schedule一个什么都不做的task, 如果抛出 IllegalStateException 则该 Timer 已经出问题, 如果正常返回则应该可以断定还在正常运行.
------------------------------------
用心跳的方法来检测.
------------------------------------
要在你的线程中加上 执行的逻辑断点,每次执行到这个地方更新一下状态值,然后监视线程检查这个状态值。
Java代码 ',1)">
class Th implements Runnable {
Date checkDate = null;
public void run(){
while (true) {
checkDate=new Date();
try {Thread.sleep(10000);} catch(Exception e) {}
}
}
}
boolean checkLive(Th th) {
long tick = System.currentTimeMillis();
if (tick - th.checkDate.getTime() > 10000) {
return false;
}
return true;
}
------------------------------------
请问楼上CheckLive方法检查的是执行时间,这个会不会有问题,如果我在执行的时间很长而sleep的时间很短的话似乎会有问题,另外请问如果我已经拥有了某个Thread的引用,我想停掉这个线程应该用什么方法?stop()和destroy()是不被推荐的
------------------------------------
比较安全简单的方案是:
Timer只用一个就好,定期启动工作线程,
每个工作线程只做一次任务然后就退出,
下一次任务则由定时器启动新的线程来完成。