概括
我们从几个问题入手,如果搞清楚这几个问题,也就理解了这个线程池的原理了
线程池中的线程是否固定的?
答: 不是的,线程池中的线程数量随着请求量的变化而动态变化,不过一直保持在_minThreads到_maxThreads之间。线程什么时候新增?什么时候会退出?
答: 当请求过来,但是又没有空闲的线程,那么就会新增,当然这个也收_maxThreads限制。退出有两种情况:一是线程被中断了,另外一种设置了超时退出时间并且时间真的到了。
重要的成员
线程池常规成员:
private int _idleTimeout; //线程空闲多久后退出
private int _maxThreads; //最大线程数
private int _minThreads; //最小线程数
private final BlockingQueue<Runnable> _jobs; //任务队列,提交的任务都先放到这里来
private final ConcurrentHashSet<Thread> _threads=new ConcurrentHashSet<>(); //线程池中所有线程
构造函数
线程池启动
线程池通过doStart函数启动
protected void doStart() throws Exception
{
super.doStart();
_threadsStarted.set(0);
startThreads(_minThreads);
}
代码比较简单,先调用父类的doStart,然后把线程数量设置为0,同时通过startThreads函数启动了_minThreads个线程,我们来看下这个线程启动函数
private boolean startThreads(int threadsToStart)
{
while (threadsToStart > 0 && isRunning())
{
int threads = _threadsStarted.get();
if