我有一个进程,其后台线程之一(Thread-A
)执行任务。如果进程挂起/崩溃,我想确保后台线程崩溃/停止(对我来说还可以)。
我的意思是我不想处于某些线程崩溃的情况,因此该进程本质上是非功能性的,并且后台线程(Thread-A
)继续运行。
我需要以某种方式让那个线程理解这个问题 有这种模式吗?可能会进行某种健康检查?尽管我怎么能确定我没有得到健康检查线程的相同问题。
也许我对此感到困惑。你能帮帮我吗?
答案 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;
}
}