1

我编写了一个带有多个线程的小服务器。很多小时后(据说目前我无法重现该问题)服务器停止工作。我的代码看起来像这样。

线程2:

while(true)
{

                System.out.println("Point 1");
                Socket abc = serverSocket.accept();
                System.out.println("Point 2");
                connection = true;
}

Thread1 在 Thread.sleep(1000) 循环中等待并检查连接是否为真。如果是这样,它开始工作,否则它打印“等待”。如果连接中止,它将连接设置为假。

现在我的主程序连接到服务器。服务器打印等待等待(依此类推,直到建立连接)点 1 点 2 应该如此。

现在经过几个小时的运行,我的客户端仍然可以连接,它说连接已建立(通过 clientSocket = new Socket(inetAddress,Integer.parseInt(port)); 假设在此命令成功时无异常建立连接)。

在运行 Thread1 几个小时后,无论我与客户连接的频率如何,都只会打印“等待”、“等待”。我被它难住了,因为它只有在运行多个小时后才会发生。Java 版本是 java 版本 "1.7.0_07" Java(TM) SE Runtime Environment (build 1.7.0_07-b10) 此版本是否有任何已知问题或错误在哪里?任何线索如何重现错误?

感谢帮助。

4

2 回答 2

0

如果您不同步对connection字段的访问并且它不是volatile字段,则一个 Thread1 可能看不到connectionThread2 中的更改。这就是Java 内存模型的工作原理。

于 2012-11-22T22:14:35.823 回答
0

我终于解决了这个问题。拥有该代码就足够了

InetAddress inetAddress = InetAddress.getByName("0.0.0.0");
serverSocket = new ServerSocket(39999,0,inetAddress);

我的客户说已连接。不需要像这样的代码

Socket neuSocket = serverSocket.accept();

由于 while 循环之外的 catch 块,整个线程被终止。Java 有时非常令人困惑。如果线程在声明 ServerSocket 时停止,则它不应再在该套接字上侦听。

于 2012-11-24T13:31:35.887 回答