2013-02-19 77 views
1

我有一个进程,它的后台线程之一(Thread-A)执行任务。如果进程挂起/崩溃,我想确保后台线程崩溃/停止(对我来说)。如何在线程之间执行健康检查?

我的意思是我不想处于某些线程崩溃的情况,所以这个过程本质上是非功能性的,并且后台线程(Thread-A)继续前进。

我需要以某种方式使该线程理解问题。
有没有这样的模式?某种健康检查可能是?尽管如何我可以肯定我没有得到健康检查线程同样的问题。

也许我对此感到困惑。你能帮我解决吗?

回答

1
public class HealthChecker 
{ 
    public final long THRESHOLD = 10000L; // 10 seconds 

    private final Map <Thread, Long> lastFineReports = 
     new ConcurrentHashMap <Thread, Long>(); 

    /** 
    * Each thread should call this method periodically. 
    */ 
    public void iAmFine() 
    { 
     lastFineReports.put (
      Thread.currentThread(), 
      Long.valueOf (System.currentTimeMillis())); 
    } 

    /** 
    * Used by whatchdog to know whether everything is OK. 
    */ 
    public boolean isEverythingOK() 
    { 
     Long [] timestamps = 
      lastFineReports. 
       values(). 
        toArray (new Long [lastFineReports.size()]); 

     long now = System.currentTimeMillis(); 
     for (Long t: timestamps) 
      if (now - t.longValue() > THRESHOLD) 
       return false; 

     return true; 
    } 
} 
+0

+ 1.非常有趣 – Jim 2013-02-20 07:29:50

1

您需要查看java.util.concurrent中的ExecutorService,然后只要您的后台线程是周期性的,因此可以停止,则可以在主线程退出时使用ExecutorService.shutdown()来请求服务终止。

否则,您需要使用AtomicBoolean在线程之间发出信号,并在布尔值为false时指示后台线程退出。

最后,要检测第一个线程中的崩溃,请使用带回调函数的UncaughtExceptionHandler来指示后台线程退出。

当然,这可以通过使用daemon threads来避免,但是如果后台线程意外死亡,它不会允许后台线程自行清理。

+0

这不是关于线程之间的信号传递,而是健康检查和理解有问题。 – Jim 2013-02-19 10:50:09