2

バックグラウンド スレッド ( Thread-A) の 1 つがタスクを実行するプロセスがあります。プロセスがハング/クラッシュした場合は、バックグラウンド スレッドもクラッシュ/停止することを確認したいと思います (私には問題ありません)。

私が言いたいのは、一部のスレッドがクラッシュしたためにプロセスが実質的に機能せず、そのバックグラウンド スレッド ( Thread-A) が続行するような状況にはなりたくないということです。

どういうわけかそのスレッドに問題を理解させる必要があります。
これにはパターンがありますか?なんらかの健康診断かも?それでも、ヘルスチェックスレッドで同じ問題が発生しないようにするにはどうすればよいですか。

おそらく私はこれについて混乱しています。助けていただけませんか?

4

2 に答える 2

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 に答える
1

ExecutorServiceinを確認する必要があります。その後、バックグラウンド スレッドが定期的であるため停止できる限りjava.util.concurrent、メイン スレッドが終了するときにサービスを終了するように要求できます。ExecutorService.shutdown()

それ以外の場合は、 を使用しAtomicBooleanてスレッド間でシグナルを送信し、ブール値が false の場合に終了するようにバックグラウンド スレッドに指示する必要があります。

最後に、最初のスレッドでクラッシュを検出するにはUncaughtExceptionHandler、バックグラウンド スレッドに終了を通知するコールバックを使用して を使用します。

もちろん、これはデーモン スレッドを使用することですべて回避できますが、バックグラウンド スレッドが予期せず強制終了された場合に、バックグラウンド スレッドをクリーンアップすることはできません。

于 2013-02-19T10:46:43.430 に答える