线程池工作流程

工作流程

线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。

当调用 execute() 方法添加一个任务时,线程池会做如下判断

1、如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务

2、如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列

3、如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务

4、如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常RejectExecutionException

当一个线程完成任务时,它会从队列中取下一个任务来执行。

当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到 corePoolSize 的大小。

参数解释

int corePoolSize 

该线程池中核心线程数最大值 。线程池新建线程的时候,如果当前线程总数小于corePoolSize,则新建的是核心线程,如果超过corePoolSize,则新建的是非核心线程。核心线程默认情况下会一直存活在线程池中,即使这个核心线程啥也不干(闲置状态)。

int maximumPoolSize

该线程池中线程总数最大值线程总数 = 核心线程数 + 非核心线程数。

long keepAliveTime

该线程池中非核心线程闲置超时时长。一个非核心线程,如果不干活(闲置状态)的时长超过这个参数所设定的时长,就会被销毁掉。

TimeUnit unit

keepAliveTime的单位,TimeUnit是一个枚举类型

BlockingQueue workQueue

该线程池中的任务队列。维护着等待执行的Runnable对象当所有的核心线程都在干活时,新添加的任务会被添加到这个队列中等待处理,如果队列满了,则新建非核心线程执行任务。


参见:理解线程池的原理

参见:线程池,这一篇或许就够了

猜你喜欢

转载自blog.csdn.net/u012501054/article/details/89473792