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