是否每一个Request都由一个不同的Thread来处理

关于Request和Thread的关系一直有一个疑问,一般的理解就是对应每一个Request会有一个Thread来处理,问题是每一个Request是否对应的Thread是否一样,如果是一样,那么程序中在用到ThreadLocal的时候,Thread.currentThread岂不是相同,如果不一样,web 服务器是怎样做到保证用不同的Thread来处理不同的Request?

为了减少这种创建和销毁Thread的开销,一般的Web服务器在内部都有一个线程池来维护所创建的Thread,并有一个限定值控制线程池中Thread的总量。如果服务器所接受的Request数量超过线程池中Thread限制,就一部分Request处于等待状态,直到有空闲Thread才开始处理。

现在假设有一个类维护一个ThreadLocal的静态变量,每一次请求时候,都会调用ThreadLocal.get()/set() 操作, 大家都知道这些操作实际上是以Thread.currentThread为Key,取得一个对象的,问题的关键就在这里,如果每一个Request对应的Thread是一样,那么这个地方返回的对象就会是一样的,是否就混乱了呢?

现在有一个系统部署在WebLogic10下面,在第一次打开一个页面的时候,会有一个Thread被创建来处理该请求,再次打开其他页面时候,系统并不一定会创建一个新的Thread来处理,两次请求的Thread是相同的,再打开多个其他页面(超过10个),在这10多次的请求中,系统只会创建4个Thread来处理,那就是说这10多次的请求中,有一部分请求是使用相同的Thread来处理的。如果是这样的情况,上面的问题该如何解释呢?

我想Tomcat, Jboss在处理Request和Thread的时候和WebLogic应该大同小异,那么上面的问题该如何解释呢?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值