线程池的各种参数面试中问的最多的就是线程池的各种参数的含义,以及线程池的整个运行过程。必须了解这一点。ThreadPoolExecutor一共有4个构造函数,但是最后一个调用构造函数参数含义如下unitBlockingQueue任务队列,用于保存等待执行的任务阻塞队列ThreadFactory用于设置线程工厂RejectedExecutionHandler饱和策略,类比学习这些参数。我们把线程池比作一个项目组,线程就是这个公司的成员。坚守岗位的人都签了劳动合同,不能随便退出。maximumPoolSize:当项目很忙的时候,不得不加人,请其他项目组的人帮忙。但是公司空间有限,最多只能加到maximumPoolSize个人。项目空闲的时候要撤人,最大可以撤人到corePoolSize个人keepAliveTime&unit:上面说了项目会根据忙的情况增减人员,那么忙和闲怎么定义编程世界?如果一个线程在keepAliveTime(timenumber)*unit(timeunit)一段时间内没有执行任务,说明这个线程很空闲。如果此时线程数大于corePoolSize,这个线程就会被回收提交任务,怎么处理呢?这就是处理策略。线程池提供了4种策略。也可以实现RejectedExecutionHandler接口来自定义策略类策略。忽略,什么都不会发生。DiscardOldestPolicy丢弃队列中最新的任务,执行当前任务。线程池的工作流程可以参考源码了解以下过程1.线程池刚创建的时候,里面没有线程。任务队列作为参数传入。但是,即使队列中有任务,线程池也不会立即执行。2、调用execute()方法添加任务时,线程池会做如下判断:如果正在运行的线程数小于corePoolSize,则立即创建一个线程来运行这个任务b。如果正在运行的线程数大于或等于corePoolSize,则将此任务放入队列c。如果此时队列满了,运行的线程数小于maximumPoolSize,那么还是需要创建一个非核心线程来立即运行这个任务d。如果队列已满,并且正在运行的线程数大于等于maximumPoolSize,那么线程池会抛出RejectedExecutionException3.当一个线程完成任务后,会从队列中取出下一个任务执行4.当一个线程无事,超过一定时间(keepAliveTime),线程池会判断,如果当前运行的线程数大于corePoolSize,则停止该线程。因此,线程池的所有任务完成后,最终会收缩到corePoolSize的大小。整个过程可以用下图表示。转载本文请联系爪哇石塘公众号。