线城池的实现
JAVA中,JDK自带的线程池实现类是
java.util.concurrent.ThreadPoolExecutor
直接创建这个类的实例即可创建一个线程池
线程池的参数说明
ThreadPoolExecutor有很多个构造函数,都是围绕着以下6个参数来变的
- corePoolSize 核心线程数,通常情况下,是线程池最少维持的线程数量
- maximumPoolSize 最大线程数,限制最大创建的线程数
- keepAliveTime 空闲线程等待的最长时间,构造器中通常会带上一个时间单位(TimeUnit)
- threadFactory 线程工厂,需要创建线程时,就会调用threadFactory的newThread方法
- rejectedExecutionHandler 拒绝策略,线程队列满了后再execute时,据此来决定需要做什么操作,比如拒绝、单线程run等
- workQueue 线程队列,一般有链表、环状List两大实现
- allowCoreThreadTimeOut 是否允许核心线程在空闲keepAliveTime后关闭
自带的rejectedExecutionHandler
- CallerRunsPolicy 如果队列满了,再execute时会直接在当前线程中调用run方法
- AbortPolicy 默认的策略,队列满后再execute会抛出一个异常
- DiscardPolicy 此策略啥都不干,相当于把这个任务丢掉了
- DiscardOldestPolicy 和上一个不同,这个策略丢弃队列中最开头那个任务.
JAVA线程池的状态流转
注意事项
众所周知,shutdown后,线程池不再接受新的任务,但会处理队列中已存在的请求,实际上是在ThreadPoolExecutor.execute的时候拒绝新请求的
但我们可以通过workQueue.offer的形式,绕过线程池的拒绝策略,直接往工作队列中增加任务,线程池会一直保持shutdown状态,直到workQueue为空