ThreadPoolExecutor是一个ExecutorService,实现了Executor接口,是一个线程池服务的实现。通常通过Executors类的工厂方法来创建。
一、实现原理
1、关键要素
要理解线程池的实现原理,主要理解以下的关键要素:
• 线程池的状态:提供了线程池生命周期中所处的不同状态,分别为以下状态(分别用0,1,2,3表示):
①RUNNING: 可以接收新任务和可以处理队列中的任务;
②SHUTDOWN: 不接收新任务,可以继续处理队列中的任务;
③STOP: 不接收新任务,也不处理队列任务,中断在执行的任务;
④TERMINATE: 类似STOP,所有的线程都会停止。
• 线程数量控制参数:用于控制何时创建线程,何时不能创建线程和任务逻辑控制。
①corePoolSize: 池中核心线程的数量;
②maximunPoolSize: 池中最大的线程数量;
③poolSize: 当前池中的线程数量;
• 工作者线程和工作队列:工作者线程从工作队列中获取任务并执行,如果设置了超时参数,工作者线程如果没有任务时,会被回收。工作队列使用的都是阻塞BlockingQueue。
• 线程工厂:ThreadFactory,用于创建新线程,可以自定义线程的一些属性,比如名称等,如果在初始化是没有配置,就会使用默认的ThreadFactory。
• 保持活动的时间:keepAliveTime,当线程池中有多于corePoolSize的线程时,多出的线程空闲时间超过keepAliveTime时将会被清理。
• 拒绝策略:当线程池已经关闭或线程数量达到最大数或工作队列已经饱和时,将拒绝执行新的任务, 主要实现了以下4种拒绝策略:
①AbortPolicy:中断策略,默认的策略,拒绝任务并抛出运行时异常RejectedExecutionException;
②CallerRunsPolicy:使用调用者线程执行任务,除非线程池已经shutdown。
③DiscardPolicy:不能执行的任务将删除;
④DiscardOldestPolicy:如果执行程序未关闭,位于队列头的任务被删除,然后重试执行程序(失败则重复此过程)。