Java 服务器崩溃时线程会发生什么情况?

Java 服务器崩溃时线程会发生什么情况?,java,multithreading,client-server,Java,Multithreading,Client Server,假设我遵循一个客户机-服务器模型,一个客户机(实际上是一个线程)在远程服务器上阻塞,而远程服务器实际上是一个监视器 如果服务器因某种原因崩溃,该线程会发生什么情况 答案是:这取决于: 有可能这根线就在那里;永远等待 但也有可能在某个时刻抛出异常;而那根线不知怎么又“活着”回来了 在这里起作用的事物: 底层TCP堆栈 您对此的使用(例如,可以为套接字提供超时值;这会导致在超时情况下引发异常) 你的客户是如何编码的 换句话说:没有人能告诉您的客户机应用程序将要做什么。因为我们没有关于您正在处

假设我遵循一个客户机-服务器模型,一个客户机(实际上是一个线程)在远程服务器上阻塞,而远程服务器实际上是一个监视器

如果服务器因某种原因崩溃,该线程会发生什么情况

答案是:这取决于:

  • 有可能这根线就在那里;永远等待
  • 但也有可能在某个时刻抛出异常;而那根线不知怎么又“活着”回来了
在这里起作用的事物:

  • 底层TCP堆栈
  • 您对此的使用(例如,可以为套接字提供超时值;这会导致在超时情况下引发异常)
  • 你的客户是如何编码的
换句话说:没有人能告诉您的客户机应用程序将要做什么。因为我们没有关于您正在处理的实现和配置细节的任何信息

或者,改变观点:你应该确保你的客户使用某种形式的超时。如上所述,这可以通过在用于通信的服务器上设置超时来实现。或者让另一个线程监视与服务器对话的所有线程;这会在某个时刻起作用,以防止这些线程永远等待


长话短说:如果你认真对待这些问题;你必须做大量的研究;迈克尔·尼加德(Michael Nygard)的经典老歌《发布它》(Release it)是一个很好的起点

感谢您的解释:)所以,据我所知,一种可能的方法是:在客户机中,定义一个超时,该超时将表示:当线程发送消息时,它等待X次回复,否则它将继续。是吗?从10公里的角度看;对但当然,在现实中,事情更加困难。如前所述,您可以指定套接字对象的超时。但我们必须明白,这些暂停实际上是什么时候开始的。当然,这是在TCP层上。而“层”是您通常想要对大多数代码“隐藏”的东西。但请理解:这确实是一个“巨大”的话题。如果我有更具体的建议,我早就写下来了;-)