我有一个进程,它的后台线程之一(Thread-A
)执行任务。如果进程挂起/崩溃,我想确保后台线程崩溃/停止(对我来说)。如何在线程之间执行健康检查?
我的意思是我不想处于某些线程崩溃的情况,所以这个过程本质上是非功能性的,并且后台线程(Thread-A
)继续前进。
我需要以某种方式使该线程理解问题。
有没有这样的模式?某种健康检查可能是?尽管如何我可以肯定我没有得到健康检查线程同样的问题。
也许我对此感到困惑。你能帮我解决吗?
我有一个进程,它的后台线程之一(Thread-A
)执行任务。如果进程挂起/崩溃,我想确保后台线程崩溃/停止(对我来说)。如何在线程之间执行健康检查?
我的意思是我不想处于某些线程崩溃的情况,所以这个过程本质上是非功能性的,并且后台线程(Thread-A
)继续前进。
我需要以某种方式使该线程理解问题。
有没有这样的模式?某种健康检查可能是?尽管如何我可以肯定我没有得到健康检查线程同样的问题。
也许我对此感到困惑。你能帮我解决吗?
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;
}
}
您需要查看java.util.concurrent
中的ExecutorService
,然后只要您的后台线程是周期性的,因此可以停止,则可以在主线程退出时使用ExecutorService.shutdown()
来请求服务终止。
否则,您需要使用AtomicBoolean
在线程之间发出信号,并在布尔值为false时指示后台线程退出。
最后,要检测第一个线程中的崩溃,请使用带回调函数的UncaughtExceptionHandler
来指示后台线程退出。
当然,这可以通过使用daemon threads来避免,但是如果后台线程意外死亡,它不会允许后台线程自行清理。
这不是关于线程之间的信号传递,而是健康检查和理解有问题。 – Jim 2013-02-19 10:50:09
+ 1.非常有趣 – Jim 2013-02-20 07:29:50