我的讨论
没有NIO:
对于每个keepAlive连接服务器,继续阻塞线程。
使用NIO:
此连接器有几个轮询线程,用于保持所有连接用户的连接活动,而只要数据(新的HTTP请求)可用,就会调用工作线程
现在: 如果我有一个简单的servlet,它将一个100 KB的字符串返回给客户端(浏览器)。
....
String HunderdKBString = "reallylongstring"
PrintWriter out = response.getWriter();
out.println(HunderdKBString);
....
如果连接了1 KB连接的客户端,则接收字符串大约需要100秒 那么java线程将被阻止大约100秒吗?
TCP缓冲区,Java OutputStream
或Writer
或其他缓冲区如何影响线程阻塞时间?
PS:使用带有oracle JDK 1.7的centos 7中的apache-tomcat-8.0.24。
编辑:如上所述,线程确实被阻塞,缓冲区可以减少线程块时间。如何通过使用这些缓冲区来优化tomcat / OS来减少线程块时间?如果由于许多连接速度慢的客户端连接到tomcat而导致tomcat正在挨饿,那么在生产环境中如何检测?
答案 0 :(得分:2)
那么java线程会被阻止大约100秒吗?
是
TCP缓冲区,Java OutputStream或Writer或其他缓冲区如何影响线程阻塞时间?
如果缓冲区足够大以容纳发送的数据,则发送线程不会阻塞。