线程池模型

其实,javaweb就是一个socket,这个socket监听并接受到达的http请求,请求接受后,可以封装数据,交给web层来处理这个请求
大概就会是一个socket线程监听请求,一旦接收到请求,那么就handlerRequest.然后封装一个respsonse返回.
因为只有一个socket线程,所以,如果返回一个response需要10ms 那么100ms的时间内只能返回10个请求
那么,自然就想要多个线程来处理了. 被称为“thread per request”(一个线程处理一个请求)这一技术 , 就诞生了.(NGINX和Node.js采用的事件驱动异步模型,它们都没有使用线程池。)

但是这样做的代价太大了,因为服务器的资源是有限的, 不能无限的给你创建线程.

每个线程都需要一定的内存空间来作为自己的栈空间。
通过使用-Xss参数来调整每个线程的栈空间,可以在一定程度上解决资源枯竭的问题

那么线程池这一技术就很好的解决了这个问题
通过一个简单的线程池来避免持续地创建新线程,限制最大线程数量。线程池跟踪着所有线程,在线程数量达到上限前,它会创建新的线程,当有空闲线程时,它会使用空闲线程。

那么就会有一个问题:如果所有的线程都在工作的时候,有一个request到达那么会发生什么呢?

LinkedBlockingQueue用一个工作队列来解决这个问题.当线程都满了的时候就把request放入Queue里面,线程在QUEUE里拿东西去执行,当队列也满了那么就开始阻塞
服务器端常见的就是503 Service unavailable,

多少线程合适呢?
利特尔法则
L=SW
L—系统里的请求数量、S—请求到达的速率和W—每个请求的处理时间。例如,如果每秒10个请求到达,处理一个请求需要1秒,那么系统在每个时刻都有10个请求在处理。如果处理每个请求的时间翻倍,那么系统每时刻需要处理的请求数也翻倍为20,因此需要20个线程。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值