每隔一段时间我们就会
Mar 31, 2015 7:24:32 PM org.apache.tomcat.util.threads.ThreadPool logFull
SEVERE: All threads (200) are currently busy, waiting. Increase maxThreads (200) or check the servlet status在Catalina日志中,服务器停止响应。服务器的使用率非常低,并发用户数不会接近200 (繁忙时为2-3个)
线程转储显示了其中的199个:
"TP-Processor200" daemon prio=10 tid=0x00002b513c31b000 nid=0x1c44 runnable [0x00002b514a9a7000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- locked <0x00000007873208a0> (a java.io.BufferedInputStream)
at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:628)
at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:566)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:693)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Thread.java:662)和其中之一
"TP-Processor4" daemon prio=10 tid=0x00002b513c21a000 nid=0x7470 in Object.wait() [0x00002b5135520000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x0000000784a7a208> (a org.apache.tomcat.util.threads.ThreadPool)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.threads.ThreadPool.findControlRunnable(ThreadPool.java:339)
- locked <0x0000000784a7a208> (a org.apache.tomcat.util.threads.ThreadPool)
at org.apache.tomcat.util.threads.ThreadPool.runIt(ThreadPool.java:314)
at org.apache.jk.common.ChannelSocket.acceptConnections(ChannelSocket.java:676)
at org.apache.jk.common.ChannelSocket$SocketAcceptor.runIt(ChannelSocket.java:879)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Thread.java:662)有没有人知道为什么它会抱怨繁忙的线程,而它们显然不是?
发布于 2018-05-19 12:29:48
首先,当与套接字(即SocketInputStream)一起使用时,InputStream方法在默认情况下将阻塞,“直到接收到数据,检测到流的结尾,或者抛出异常”。可以使用setSoTimeout设置超时值,以将读取阻塞限制为x,当达到该值时,将抛出SocketTimeoutException。
在另一个线程中被阻塞读取的套接字可以关闭以进行输入,然后应向读取线程发出信号以关闭套接字并退出。
这可以通过在套接字上使用shutdownInput方法来完成:
//Shutting down input to socket...
socket.shutdownInput(); 然后,您仍然可以使用以下命令发送到输出套接字:
//Write to socket again
toSocket.print("is socket connection still available?\r\n");
//close socket
socket.close(); 也取决于用来传递流的任何“设备”。如果它是容器或COM端口,这种行为可能会根据实现或供应商specification...if而有所不同这就是你可能会看到这里提供的一些建议:Java InputStream blocking read -正如建议的那样,可能使用DataInputStream包装输入,以使事物具有更多的“文件”一致性,即确保在未收到任何内容时抛出EOFException。
还有另一种选择可能是切换到非阻塞连接器实现,如NIO -在连接空闲期间线程不会被阻塞,而是由特殊的“轮询器”线程监控,这些线程用于限制线程池中“正常”线程的过度消耗。
有关NIO和线程争用的一些有用信息也可以在这里找到:http://tutorials.jenkov.com/java-nio/server-socket-channel.html
https://stackoverflow.com/questions/29565592
复制相似问题