线程池—线程池中的参数与线程池的处理流程
线程池中的重要参数:
- corePoolSize:核心线程数,通俗的说就是队列没满时,最大线程并发数
- workQueue: 阻塞队列类型
- maximumPoolSizes:最大线程数,通俗的说就是当阻塞队列满了的时候,最大的并发数
- RejectedExecutionHandler:拒绝策略,当任务数超过maximumPoolSizes + workQueue 时,任务会触发拒绝策略。JDk有四种默认的拒绝策略,见最下面
- keepAliveTime:空闲时间多久会被回收的时间限制
线程池的处理流程
当一个任务来了的时候
- 会先判断是否超过corePoolSize,如果没有超过,就新建一个线程执行任务并加入线程池线;若超过了corePoolSize则会尝试放入阻塞对列
- 如果阻塞对列没有满,就在阻塞队列中等待执行,如果阻塞队列满了,就尝试新建一个线程处理
- 如果线程池中的线程数没有超过了maximumPoolSizes最大线程数,则新建一个线程处理任务并加入到线程池中;如果超过maximumPoolSizes则会调用RejectedExecutionHandler拒绝策略处理
- 空闲的线程(非核心线程)会在到达keepAliveTime时间之后没有被使用的话就被回收
拒绝策略
- CallerRunsPolicy:只要线程池不关闭,就执行任务
- AbortPolicy:丢弃任务,抛出运行时异常
- DiscardPolicy:直接忽视,什么也不发生
- DiscardOldestPolicy:将任务队列中最先进入的任务移除,并将新任务加入对列。