Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确退出应用程序_Java_Multithreading_Exception - Fatal编程技术网

Java 如何正确退出应用程序

Java 如何正确退出应用程序,java,multithreading,exception,Java,Multithreading,Exception,我的应用程序中有一个线程,该线程永久运行,每5分钟向监控应用程序发送一次心跳信号 如果我的应用程序在异常块中失败,我需要退出运行它的线程(while循环基于未被中断的线程) 这是否意味着在每次捕获中,我都需要一个系统出口或一个中断线程的调用?这似乎是一个非常混乱的方法,但我不知道还有其他方法 谢谢您可以将此线程指定为守护进程线程。它将以应用程序终止。考虑使用主应用程序和线程都可读的对象。如果主应用程序遇到异常,它应该有一个finally块,用于设置对象,告诉心跳线程应用程序已经或正在关闭 这可能

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

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

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


谢谢

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

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


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

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

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

while(expression)
表达式返回布尔值时,始终可以替换为:

while(Thread.currentThread.interrupted()){
  if(!expression)
     break;
//....
}
这将是一个完美的解决方案。或者您也可以使用一些布尔值来通知。或者,如果您的
while
基于队列,则添加一些毒药丸,这将表示是时候退出循环了

守护进程线程
也是上面提到的一种解决方案,但它取决于您是否要存储一些数据或关闭/管理一些资源。那将是一个问题


最后,为了保证健壮性,您需要制定合适的关闭策略。

您可以将线程设置为守护线程您可以将hearbeat线程标记为守护线程-这很有意义,因为它是一个辅助线程,而不是主任务,所以可以标记为守护进程线程。@Jatin为我试图传达的内容提供了更好的解释。好吧,为了健壮性,我想说,在很大程度上,没有显式关闭是最佳策略。@MartinJames对不起,显式关闭>是什么意思?您实际上编写用户代码来尝试终止线程,而不是让操作系统来做。