分享

请教线程监控的问题

 CevenCheng 2010-12-08
   在一个多线程的环境下,有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 已经出问题, 如果正常返回则应该可以断定还在正常运行.

------------------------------------
用心跳的方法来检测.

------------------------------------
要在你的线程中加上 执行的逻辑断点,每次执行到这个地方更新一下状态值,然后监视线程检查这个状态值。 
Java代码 
  1. class Th implements Runnable {  
  2. Date checkDate = null;  
  3. public void run(){  
  4. while (true) {  
  5. checkDate=new Date();  
  6. try {Thread.sleep(10000);} catch(Exception e) {}  
  7. }  
  8. }  
  9. }  
  10.   
  11.   
  12. boolean checkLive(Th th) {  
  13.     long tick = System.currentTimeMillis();  
  14.     if (tick - th.checkDate.getTime() > 10000) {  
  15.         return false;  
  16.     }  
  17.      return true;  
  18. }  


------------------------------------
   请问楼上CheckLive方法检查的是执行时间,这个会不会有问题,如果我在执行的时间很长而sleep的时间很短的话似乎会有问题,另外请问如果我已经拥有了某个Thread的引用,我想停掉这个线程应该用什么方法?stop()和destroy()是不被推荐的

------------------------------------
比较安全简单的方案是: 
Timer只用一个就好,定期启动工作线程, 
每个工作线程只做一次任务然后就退出, 
下一次任务则由定时器启动新的线程来完成。 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多