首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat: SEVERE:所有线程(200)当前都很忙

Tomcat: SEVERE:所有线程(200)当前都很忙
EN

Stack Overflow用户
提问于 2015-04-10 23:45:22
回答 1查看 2.8K关注 0票数 1

每隔一段时间我们就会

代码语言:javascript
复制
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个:

代码语言:javascript
复制
"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)

和其中之一

代码语言:javascript
复制
"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)

有没有人知道为什么它会抱怨繁忙的线程,而它们显然不是?

EN

回答 1

Stack Overflow用户

发布于 2018-05-19 12:29:48

首先,当与套接字(即SocketInputStream)一起使用时,InputStream方法在默认情况下将阻塞,“直到接收到数据,检测到流的结尾,或者抛出异常”。可以使用setSoTimeout设置超时值,以将读取阻塞限制为x,当达到该值时,将抛出SocketTimeoutException。

在另一个线程中被阻塞读取的套接字可以关闭以进行输入,然后应向读取线程发出信号以关闭套接字并退出。

这可以通过在套接字上使用shutdownInput方法来完成:

代码语言:javascript
复制
//Shutting down input to socket...
socket.shutdownInput(); 

然后,您仍然可以使用以下命令发送到输出套接字:

代码语言:javascript
复制
//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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29565592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档