Tomcat:严重:所有线程(200)当前都很忙

时间:2015-04-10 15:45:22

标签: tomcat6

每隔一段时间我们就会得到

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)

任何人都可以弄清楚为什么它会在忙碌的线程中抱怨它们显然不是?

1 个答案:

答案 0 :(得分:0)

首先,当与套接字(即SocketInputStream)一起使用时,InputStream方法将默认阻塞&#34;直到收到数据,检测到流的末尾或抛出异常。&#34;可以使用setSoTimeout设置超时值,以限制读取到x ms时的阻塞,达到此值时将抛出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(); 

还取决于&#34;设备&#34;被用来传递流...即。如果它类似于容器或COM端口,则此行为可能因实现或供应商规范而有所不同......如果是这种情况,您可以查看此处提供的一些建议:{{3} - 并且正如所建议的那样,可能使用DataInputStream包装输入以使事情表现得更多&#34;类似文件&#34;一致性,即确保在没有收到任何内容时抛出EOFException。

另一个选择可能是切换到非阻塞连接器实现,如NIO - 其中线程在连接空闲期间不被阻塞,而是由特殊的&#34; poller&#34;用于限制&#34;正常&#34;过度消费的线程。线程池中的线程。

有关NIO和线程争用的一些有用信息也可以在这里找到:Java InputStream blocking read