2

设想

我有一个 java 应用程序(使用 Spring Integration 侦听 TCP/IP 端口)。我正在使用一些工作线程和使用 java.util.concurrent.Executors 工厂创建的 ExecuterService。主线程创建工作线程并在如下循环中等待

while(!shutdownRequested)
{
    try {
         Thread.sleep(2000);
         } catch (InterruptedException e) {
           e.printStackTrace();
         }
}

我有一个关闭钩子,它会停止执行器服务并在超时时强制关闭。

问题
这个程序在我的机器上没有成功终止(Windows 7)。它留下一个线程在 tcp 端口上侦听,之后该进程变得无法访问。我无法从任务管理器中终止此进程并收到“拒绝访问”错误。

有趣的是,这个问题只发生在我的机器上,不会影响任何其他 Windows 7 机器。在所有其他机器上,控制台中的 Control-C 总是成功地停止程序。

我过去曾遇到过这个问题(使用相同的应用程序),在我重新格式化并重新安装 Windows 后,这个问题神奇地消失了。(我知道这有点过分了!!)

该应用程序运行了好几个月,直到不幸的是我最近因为其他原因不得不再次重新格式化我的电脑。重新格式化后问题又回来了。

这是非常令人沮丧的,因为每次我需要重新启动此应用程序时我都必须重新启动 Windows,因为它无法绑定到 TCP 端口,因为僵尸进程在该端口上 litening。

任何想法我的设置可能有什么问题?

4

1 回答 1

1

您可能需要close()套接字。这将导致套接字抛出 SocketException,从而停止阻塞。

于 2012-12-01T15:17:21.867 回答