场景
我有一个 java 应用程序(使用 Spring Integration 监听 TCP/IP 端口)。 我正在使用一些工作线程和一个由 java.util.concurrent.Executors 工厂创建的 ExecuterService。 主线程创建工作线程并在循环中等待,如下所示
while(!shutdownRequested)
{
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我有一个关闭 Hook ,它会停止执行程序服务并在超时时强制关闭。
问题
该程序在我的机器 (Windows 7) 上没有成功终止。它留下一个线程监听 tcp 端口,此后进程变得无法访问。
我无法从任务管理器中终止此进程并收到“访问被拒绝”错误。
有趣的是,这个问题只发生在我的机器上,不会影响任何其他 Windows 7 机器。在所有其他机器上,控制台的 Control-C 总是成功停止程序。
我过去曾遇到过这个问题(使用相同的应用程序),在我重新格式化并重新安装 Windows 后问题神奇地消失了。 (我知道这有点过分了!!)
该应用程序完美运行了好几个月,直到不幸的是我最近因为其他原因不得不重新格式化我的电脑。重新格式化后问题又回来了。
这非常令人沮丧,因为每次我需要重新启动此应用程序时我都必须重新启动 Windows,因为它无法绑定(bind)到 TCP 端口,因为僵尸进程在该端口上闪烁。
知道我的设置有什么问题吗?
最佳答案
您可能需要 close() socket 。 这将导致套接字抛出 SocketException,从而停止阻塞。
关于Java 程序不干净地存在。创造僵尸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13659941/