Skip to content

Latest commit

 

History

History
executable file
·
24 lines (20 loc) · 1.52 KB

File metadata and controls

executable file
·
24 lines (20 loc) · 1.52 KB

线程池

背景

按照原始的情况,每个请求过来之后,服务都要创建一个线程,用来处理这个请求,处理完请求之后,需要销毁这个线程。

当量很小的时候,其实是没问题的。如果请求量比较大时,线程就会频繁的创建销毁,此时有用的资源都耗在这个上了,能抗住的请求量也就那么多,再多的请求就扛不住了。

这就是那个Why。

如果将那个线程创建之后,不销毁,这个线程一直存在,等到下个请求来的时候,还是用这个线程,这样只需要创建一次线程就可以了。

线程为什么非要等请求来才去创建呢?能不能先创建呢?也可以!

当服务启动的时候,就顺带着直接创建了一些线程,这些线程接受处理请求。线程接受请求,然后线程处理请求,处理完请求之后,就又接受请求。

当请求量徒增时,例如秒杀场景。假设现在就创建了100个线程用来接受并处理请求,突然来了120个请求,那么100个请求可以被正常接受和处理,剩余20个请求就被丢弃了。

多直接,直接拒绝掉,用户接受不了啊。如果把这20个请求,搞一个请求队列,在线程之前加个请求队列,如果线程处理完了,就从前面的队列中拉取一个请求。这样就不会造成用户请求丢失了。

引入队列

java访问下游一个服务,需要设置线程池。 java对上游暴露一个服务,也需要线程池。