我有一个进程,它的一个后台线程 ( Thread-A
) 执行任务。如果进程挂起/崩溃,我想确保后台线程也崩溃/停止(对我来说没问题)。
我的意思是我不想处于某些线程崩溃的情况下,因此该进程本质上是非功能性的,并且后台线程(Thread-A
)继续运行。
我需要以某种方式使该线程理解问题。
有这种模式吗?可能是某种健康检查?尽管如此,我怎么能确定我不会在运行状况检查线程上遇到同样的问题。
也许我对此感到困惑。你能帮帮我吗?
我有一个进程,它的一个后台线程 ( Thread-A
) 执行任务。如果进程挂起/崩溃,我想确保后台线程也崩溃/停止(对我来说没问题)。
我的意思是我不想处于某些线程崩溃的情况下,因此该进程本质上是非功能性的,并且后台线程(Thread-A
)继续运行。
我需要以某种方式使该线程理解问题。
有这种模式吗?可能是某种健康检查?尽管如此,我怎么能确定我不会在运行状况检查线程上遇到同样的问题。
也许我对此感到困惑。你能帮帮我吗?
您需要查看ExecutorService
in java.util.concurrent
,然后您可以在主线程退出时要求服务终止ExecutorService.shutdown()
,只要您的后台线程是周期性的,因此可以停止。
否则,您需要在线程之间使用AtomicBoolean
to 信号,并在布尔值为 false 时告诉后台线程退出。
最后,要检测第一个线程中的崩溃,请使用UncaughtExceptionHandler
带有回调的回调,该回调指示后台线程退出。
当然,这一切都可以通过使用守护线程来避免,但是如果后台线程被意外杀死,这将不允许后台线程自行清理。
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;
}
}