5

我的应用程序中有一个线程永久运行,每 5 分钟向监控应用程序发送一次心跳。

如果我的应用程序在异常块中失败,我需要退出正在运行它的线程(while 循环基于未中断的线程)。

这是否意味着在每次捕获中我都需要系统退出或调用来中断该线程?这似乎是一种非常混乱的方法,但我也不知道其他方法。

谢谢

4

3 回答 3

4

您可以将此线程指定为守护线程。它将随着应用程序终止。

于 2013-04-16T13:20:09.213 回答
1

考虑使用主应用程序和线程都可读的对象。如果主应用程序遇到异常,它应该有一个finally块来设置该对象,告诉心跳线程应用程序已经或正在关闭。

这可能会为您提供一种机制,让心跳发送最后一个“死”消息。这可以告诉监视器您的应用程序死亡并列出原因,而不是简单地不发送心跳。

于 2013-04-16T13:22:29.887 回答
1

理想情况下,您需要一种将消息从应用程序传输到线程的方式来终止。

这取决于您的 while 循环所基于的表达式。如果当前您的代码属于以下类型:

while(expression)

当表达式返回一些布尔值时,它总是可以替换为:

while(Thread.currentThread.interrupted()){
  if(!expression)
     break;
//....
}

这将是完美的解决方案。或者您也可以使用一些布尔值来通知。或者如果你while是基于队列的,那么添加一些 POISON_PILL,这表示它是时候退出循环了。

Daemon thread也是上面提到的一种解决方案,但是这取决于您是要存储一些数据还是关闭/管理一些资源。这将是一个问题。

最终为了稳健性,您需要提出合适的关闭策略。

于 2013-04-16T13:26:57.883 回答