收到请求后,http线程在60秒内保持忙碌状态。使用JConsole,我可以看到,在此期间,线程保持不变:
State: RUNNABLE
Stack trace:
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:150)
java.net.SocketInputStream.read(SocketInputStream.java:121)
org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:721)
org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:359)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:821)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:508)
org.jboss.threads.SimpleDirectExecutor.execute(SimpleDirectExecutor.java:33)
org.jboss.threads.QueueExecutor.runTask(QueueExecutor.java:806)
org.jboss.threads.QueueExecutor.access$100(QueueExecutor.java:45)
org.jboss.threads.QueueExecutor$Worker.run(QueueExecutor.java:826)
java.lang.Thread.run(Thread.java:722)
org.jboss.threads.JBossThread.run(JBossThread.java:122)
这是为什么?不应该立即使用和释放线程吗?这会影响我的服务器在高峰时间导致长时间等待。
有人可以解释我这种行为,我该如何禁用它或减少60秒的时间?
谢谢大家, 最好的问候
答案 0 :(得分:1)
您的线程在套接字读取操作时阻塞。由于您使用的是Java阻塞套接字I / O,因此HTTP连接池中的每个连接都必须具有与之关联的线程,等待新请求。
解决方案是减少HTTP连接池中的空闲超时。