线程池原理
Java线程一对一映射为内核线程。
线程池可以复用线程,限制线程数量。
参数含义
public ThreadPoolExecutor(int corePoolSize,// 线程池核心线程数
int maximumPoolSize,// 线程池最大线程数
long keepAliveTime,// 当线程数大于核心线程数时,多余的空闲线程存活的最长时间
TimeUnit unit,// 时间单位
BlockingQueue<Runnable> workQueue,// 任务队列
ThreadFactory threadFactory,// 创建线程的线程工厂
RejectedExecutionHandler handler) // 任务过多时执行拒绝策略
线程池的线程分配流程
创建线程池后默认不创建线程
在创建完线程池之后,默认情况下,线程池中没有任何线程,等到有任务来才创建线程去执行任务。但有一种情况排除在外,调用prestartAllCoreThreads()或者prestartCoreThread()方法可以提前创建等于核心线程数的线程数量,即预热,常用于抢购系统。
线程池新建线程时,如果当前线程总数小于corePoolSize,则新建的是核心线程;如果超过corePoolSize,则新建的是非核心线程。
抛出RejectedExecutionException异常
当新提交的任务无法加入到等待队列且线程数量已经等于maximumPoolSize时,如果没有为线程池设置拒绝策略,那么线程池会抛出RejectedExecutionException异常,即线程池拒绝接受这个任务。
回收超过corePoolSize的多余空闲线程
针对非核心线程,当线程池中创建的线程数量超过设置的corePoolSize,如果多余的空闲非核心线程等待keepAliveTime时间后没有任务,那么这个线程会被回收。
针对核心线程,把allowCoreThreadTimeOut设置成true,包括核心线程在内没有任务执行的所有线程,在等待keepAliveTime时间后全部回收掉。
参考资料