我有一个服务器端应用程序为每个连接的客户端打开一个套接字线程。我在每个线程中有一个 DataInputStream,它调用 read(byte[]array) 来读取数据。我还将套接字超时设置为几分钟。主要代码是这样的:
while (dataInputStream.read(array) != -1) { do something... }
但是,运行几个小时后,在带有 topthreads 插件的 jconsole 中,我可以看到几个客户端线程每个都使用 20%ish CPU。如果我点击它,调用堆栈显示线程在上面的行中被阻塞,在 read() 函数上。
我知道 read() 函数通常会阻塞以等待数据。阻塞时,它消耗很少的 CPU 周期。现在它每个都使用 20%ish,当更多线程遇到相同问题时,我的服务器运行速度越来越慢。我的服务器每秒大约有 5 个连接请求,这种情况很少发生,因为在几个小时内只有 5 个线程有问题。
我真的很困惑。有人能帮我吗?