线程池配置
线程池配置,假设是:
1.最小数量是5
2.阻塞队列容量是10
3.最大数量是20
线程池里的业务线程数量小于最小数量(5)
第一个请求
第一个请求进来的时候,这个时候,线程池没有线程,就创建新的工作线程(即Worker线程)。
然后,这个工作线程去处理当前请求的业务线程。
第二个请求
第二个请求进来的时候,这个时候,线程池已经有了一个工作线程。
但是,要注意,这个时候是不会复用线程池里已有的工作线程的。而是创建新的工作线程。
因为,线程池里根本没有复用线程的概念。
说白了,无论线程池里已有的这个工作线程是否在处理业务线程,即不管它空闲与否,其实都会创建新的工作线程。
第三个请求
同上,仍然创建新的工作线程。
。。。
第五个请求
同上。仍然创建新的工作线程。
注意,现在,线程池有几个工作线程?5个。
即,每个请求进来,都创建一个新的工作线程。
小于阻塞队列容量(10)
第六个请求
第六个请求进来的时候,提交到阻塞队列。
然后,再慢慢消费。
具体来说,是由线程池里的工作线程来慢慢消费。
具体消费的源码,参考:复用线程小节。
第七个请求
同上,也是先添加到阻塞队列。
。。。
第15个请求
同上,也是先添加到阻塞队列。
小于最大数量(20)
第16个请求
先来看,正常情况下,阻塞队列还没塞满(生产环境的容量一般是1000),就会被快速处理掉。
然后,当新的请求进来的时候,继续丢到阻塞队列里面去。
这个是和上面讲的一样。
但是,我们为了方便理解,现在假设之前的15个请求是同时到达,即
- 前面5个请求
创建5个新的请求。
- 后面10个请求
全部丢到阻塞队列。
这个