【问题标题】:How to programatically kill a server thread when it is continuously listening for new connections?当服务器线程不断侦听新连接时,如何以编程方式杀死它?
【发布时间】:2011-12-06 19:03:24
【问题描述】:

我想以编程方式杀死一个在 while(true) 循环中运行并无限监听连接的线程,由于监听是一种阻塞方法,我不能简单地将循环 statemenet 设置为 false。我的应用程序通常在连接启动服务器以侦听连接时定期交换网络,所以当它确实交换到另一个网络时,我担心旧服务器会变成僵尸并卡在那里,因为在新网络上服务器绑定在与之前的 IP 不同。

PS。将服务器绑定到本地主机不需要在网络更改后重置吗?

【问题讨论】:

  • 我建议的第一件事是将您的代码重构为非阻塞调用,如果这在您的语言中是可能的(顺便说一句,您没有提到哪个)。然后你可以打破循环......编辑:对不起,我刚刚注意到它属于 Java 类别。
  • @NoICE 语言在标签中,JAVA :) ,如何重构像 socket.accept() 这样的方法?这甚至可能吗?
  • Ruby 有 IO.select 调用而不是 accept.. 我敢打赌 java 也有其他方法可以做到这一点......只需谷歌“java 非阻塞 io”(或套接字)(我想在这方面提供更多帮助,但我是 java 初学者)

标签: java multithreading


【解决方案1】:

如果您需要能够停止位于accept 循环中的线程,您只需调用setSoTimeout,这样accept 调用就可以完成,而无需等待实际连接发生。

请注意,如果您绑定到所有接口,则在将新网络接口添加到系统时,您可能不需要创建新套接字。

其他可能性是在套接字上调用close,或在线程上调用stopinterrupt。如果您可以使用异步 I/O,请参阅 http://www.developer.com/java/article.php/3837316/Non-Blocking-IO-Made-Possible-in-Java.htm

【讨论】:

    【解决方案2】:

    只需关闭 ServerSocketChannel,调用 accept() 的线程就会抛出 AsynchronousCloseException 或 ClosedChannelException。

    另一种可能性是中断线程。根据JDK文档,它应该在调用accept()时抛出ClosedByInterruptException,从而关闭通道。但是,根据我的经验,ClosedByInterruptException 事情并不总是可靠的,并且在某些 JDK 版本中存在已知的错误。

    【讨论】:

      【解决方案3】:

      你用谷歌搜索过这个问题吗?有很多关于如何停止代码中的线程。

      Sun 的文档在这里有你需要的东西:

      http://docs.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

      这是一个相关的问题,我是从哪里得到这个的:

      How do you kill a thread in Java?

      请在提问之前环顾四周。

      【讨论】:

      • 是的,我在发布之前做了一些研究,我的问题并不像杀死一个线程那么简单,因为在我的情况下它很可能会变成一个僵尸进程。跨度>
      猜你喜欢
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2017-01-22
      • 2020-08-12
      • 2019-11-30
      • 2020-08-04
      • 2020-11-14
      • 2012-12-21
      相关资源
      最近更新 更多