我的应用程序中有一个线程,它永久运行,每隔5分钟向监控应用程序发送心跳。
如果我的应用程序在异常块中失败,我需要退出正在运行它的线程(while循环基于线程没有被中断)。
这是否意味着每次捕获我都需要系统退出或中断该线程的调用?这似乎是一个非常混乱的方法,但我也不知道如何。
由于
答案 0 :(得分:4)
您可以将此线程指定为守护程序线程。它将随申请而终止。
答案 1 :(得分:1)
考虑使用主应用程序和线程都可读的对象。如果主应用程序遇到异常,它应该有一个finally
块,它设置该对象告诉心跳线程应用程序已经或正在关闭。
这可能会为您提供心跳发送最后一条“死”消息的机制。这可以告诉监视器您的应用程序已经死亡并列出原因而不是简单地不发送心跳。
答案 2 :(得分:1)
理想情况下,您需要一种从应用程序向线程传输消息的方法,以终止。
这取决于你的while循环所基于的表达式。如果您的代码目前是类型:
while(expression)
where expression返回一些布尔值,它总是可以替换为:
while(Thread.currentThread.interrupted()){
if(!expression)
break;
//....
}
这将是完美的解决方案。或者您可以使用一些布尔值来通知。或者可能如果您的while
基于队列,则添加一些POISON_PILL,这表示是时候退出循环了。
Daemon thread
也是上面提到的解决方案,但它取决于您是否要存储某些数据或关闭/管理某些资源。那将是一个问题。
最终,为了获得稳健性,您需要提出合适的关闭策略。