在一个多线程的环境下,有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./javase/6/docs/api/java/lang/ThreadGroup.html#uncaughtException(java.lang.Thread, java.lang.Throwable)[/url] 可以捕获线程的异常. 哦, 才发现 1.5 以后可以给 Thread 直接设置 UncaughtExceptionHandlerhttp://java./javase/6/docs/api/java/lang/Thread.html#setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler) 了. 另外看了一下 java.util.Timer, 似乎你要知道它是否正常运行的话, 可以schedule一个什么都不做的task, 如果抛出 IllegalStateException 则该 Timer 已经出问题, 如果正常返回则应该可以断定还在正常运行. ------------------------------------ 用心跳的方法来检测. ------------------------------------ 要在你的线程中加上 执行的逻辑断点,每次执行到这个地方更新一下状态值,然后监视线程检查这个状态值。
------------------------------------ 请问楼上CheckLive方法检查的是执行时间,这个会不会有问题,如果我在执行的时间很长而sleep的时间很短的话似乎会有问题,另外请问如果我已经拥有了某个Thread的引用,我想停掉这个线程应该用什么方法?stop()和destroy()是不被推荐的 ------------------------------------ 比较安全简单的方案是: Timer只用一个就好,定期启动工作线程, 每个工作线程只做一次任务然后就退出, 下一次任务则由定时器启动新的线程来完成。 |
|
来自: CevenCheng > 《并发编程》