解决方案 »

  1.   

    那是session,而不是request的处理!
    而且我先要的答案是,request超时,Tomcat在代码层面是怎么去处理的。
    是怎么把这个线程资源给释放的
      

  2.   

    request超时?那是http连接超时吧
    http超时挺长的啊,5分钟是有了。
      

  3.   

    如果你说的是doPost或者doGet的方法执行时间长的话,这个没有影响,客户端会一直等待服务器端的返回。最简单的一种方式就是在doPost里打个断点。你等个10分钟试试。
    如果你说的http 408超时(客户端没有在服务器预备等待的时间内完成一个请求的发送。)的话,那还没进入doPost/doGet
      

  4.   

    其实我主要是想看看Tomcat对线程超时的处理方式是怎么样的!
    所以我才想到看看Tomcat中多线程处理request,超时会怎么样。
    这一块得深入到源码层级才能知道他的处理方式,所以我走走捷径,问问大神们
      

  5.   

    Quote: 引用 4 楼 AFer198215 的回复:

    Quote:

    各路大虾,请拔刀相助啊!
      

  6.   

    你可以看看tomcat的底层,其实他就是将http的协议规范实现了。http的底层当然也是tcp/ip的编程,当浏览器将请求发给tomcat的时候,当然既然其协议的底层是socket,tomcat也就会根据其配置的port,如8080.绑定监听。当收到请求的时候,将其按http协议标准封装成了HttpRequest的对象,交给我们做业务逻辑的处理。以下估计是楼主想知道的事情。对于任意一个网络服务器来说,不管是tomcat之类的web服务器,还是如proftpd之类的ftp服务器,或者是mysqld之类的mysql服务端。肯定都会有线程池这个概念的。会初始开几个handler的线程。这个线程数一般更多的会参考比如cpu的核心数,当然还有就是你程序的io情况,比如更常用的是cpu核心数的两倍或者是cpu核心数+1.不论如何每一个连接请求过来它会先找线程池中是否有初始出来空闲的线程,这个一般会放在诸如栈之类的数据结构中,有的话取出做请求处理。没有的话开启一个新的线程来处理。当请求结束的时候它会先看是否有连接请求在排队(消息队列),有的话将当前线程分配处理新的请求。没有的话如果其大于我们的默认的初始值(如cpu核心数+1),那么我们将线程生命周期结束。当然了如果楼主有兴趣可以学学windows的iocp和linux的epoll这两种目前在各自操作系统中最高效的socket模型。自jdk4以后,java开始出现nio的概念。这个n可以理解为new也可以理解为non-block,在tomcat7中据说已经有nio的配置,而nio的底层在windows上会选择iocp模型,linux上会选择epoll模型。java的io能力也提高了很多。
      

  7.   

    你讲的很详细,谢谢了 :)
    我现在的问题是,Tomcat是如何处理超时的线程的。想JDK的线程池,一旦submit之后就不管了,如果有future返回,也只是监听一下,即使超时了,也不会去管。
    所以我就是想指导tomcat是如何处理线程超时的。否则线程池的资源只会越来越少!
      

  8.   

    建议楼主还是down一份tomcat源码,搜索request和session相关字样,去研究一下。
      

  9.   

    你讲的很详细,谢谢了 :)
    我现在的问题是,Tomcat是如何处理超时的线程的。想JDK的线程池,一旦submit之后就不管了,如果有future返回,也只是监听一下,即使超时了,也不会去管。
    所以我就是想指导tomcat是如何处理线程超时的。否则线程池的资源只会越来越少!这你真就得自己进源码看看啦 作为程序员我感觉如果有这样的激情不去探究真的很难成为一名优秀的程序员吧 当然我这里以前也有用自己编译的tomcat7,帮你进去大概看了看 顺便说句你真的该自己去探索这样的问题 别人说再多也没用自己探索得来的那样充实 收获大。因为tomcat的源码是ant管理的 你只要用ant编译一下就ok啦。你可以通过调试的方式,然后查看其调用堆栈,很容易发现ThreadPoolExecuter这个类,因为工作忙的原因,我也没仔细看 你可以进去看看 我觉得这是任何人都不应该代替你的地方。我吧它的注释贴出来 看看你应该也大体明白了If the pool currently has more than corePoolSize threads,
     * excess threads will be terminated if they have been idle for more
     * than the keepAliveTime (see {@link
     * ThreadPoolExecutor#getKeepAliveTime}). This provides a means of
     * reducing resource consumption when the pool is not being actively
     * used. If the pool becomes more active later, new threads will be
     * constructed. This parameter can also be changed dynamically using
     * method {@link ThreadPoolExecutor#setKeepAliveTime}. Using a value
     * of <tt>Long.MAX_VALUE</tt> {@link TimeUnit#NANOSECONDS} effectively
     * disables idle threads from ever terminating prior to shut down. By
     * default, the keep-alive policy applies only when there are more
     * than corePoolSizeThreads. But method {@link
     * ThreadPoolExecutor#allowCoreThreadTimeOut(boolean)} can be used to apply
     * this time-out policy to core threads as well, so long as
     * the keepAliveTime value is non-zero.从这里也可以看出 超时的线程肯定会被回收掉呢 要不然你想想也清楚win32最大理论支持的4G内存寻址空间,即便一个线程开销2M,最多也就2000个线程。加上线程的上下文就切换,时间,空间的浪费是可想而知的。你再怎么开线程也不可能让你超过最大线程数呢
      

  10.   

    不知道你所谓的“线程超时” 是什么意思, 我只知道如果一个线程是runnable状态就会一直跑,就像5楼说的你可以写while(true)试下浏览器就一直等
      

  11.   

    web容器线程被大量长时间占用,就会出现服务阻塞的情况。访问会非常不顺畅,甚至出现等待的情况,关注服务器日志。