如何在线程之间进行健康检查?

时间:2013-02-19 10:41:07

标签: java multithreading design-patterns concurrency

我有一个进程,其后台线程之一(Thread-A)执行任务。如果进程挂起/崩溃,我想确保后台线程崩溃/停止(对我来说还可以)。

我的意思是我不想处于某些线程崩溃的情况,因此该进程本质上是非功能性的,并且后台线程(Thread-A)继续运行。

我需要以某种方式让那个线程理解这个问题 有这种模式吗?可能会进行某种健康检查?尽管我怎么能确定我没有得到健康检查线程的相同问题。

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

2 个答案:

答案 0 :(得分:1)

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

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

最后,要检测第一个线程中的崩溃,请使用带有回调的UncaughtExceptionHandler,该回调表示后台线程要退出。

当然,使用daemon threads可以避免这一切,但是如果后台线程被意外杀死,那么它将不允许后台线程自行清理。

答案 1 :(得分: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;
    }
}