2

我有一个进程,它的一个后台线程 ( Thread-A) 执行任务。如果进程挂起/崩溃,我想确保后台线程也崩溃/停止(对我来说没问题)。

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

我需要以某种方式使该线程理解问题。
有这种模式吗?可能是某种健康检查?尽管如此,我怎么能确定我不会在运行状况检查线程上遇到同样的问题。

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

4

2 回答 2

1

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

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

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

当然,这一切都可以通过使用守护线程来避免,但是如果后台线程被意外杀死,这将不允许后台线程自行清理。

于 2013-02-19T10:46:43.430 回答
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;
    }
}
于 2013-02-19T10:50:52.780 回答