Executor下有一个重要子接口ExecutorService,其中定义了线程池的具体行为
1,execute(Runnable command):履行Ruannable类型的任务,
2,submit(task):可用来提交Callable或Runnable任务,并返回代表此任务的Future
对象
3,shutdown():在完成已提交的任务后封闭办事,不再接管新任务,
4,shutdownNow():停止所有正在履行的任务并封闭办事。
5,isTerminated():测试是否所有任务都履行完毕了。
6,isShutdown():测试是否该ExecutorService已被关闭。
线程池的创建
线程池的具体实现
ThreadPoolExecutor 默认线程池
ScheduledThreadPoolExecutor 定时线程池
我们一般创建线程池用工具类
ExecutorService executor = Executors.newFixedThreadPool(5);
// 构造方法
public static ExecutorService newFixedThreadPool(int nThreads) {
//第一个nThreads 核心线程数,
//最大nThreads最大线程数
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
线程最大数=核心线程数+非核心线程数
首先由核心线程执行任务,新来的任务进入到阻塞队列,当核心线程数到达最大值,而任务队列满的时候,创建非核心线程,新来的任务由非核心线程执行,
当线程达到最大数,而且任务阻塞队列已经满的时候新来的任务只能执行拒绝策略。

线程池重点属性
ctl 是对线程池的运行状态和线程池中有效线程的数量进行控制的一个字段, 它包含两部分的信息: 线程池的运行状态 (runState) 和线程池内有效线程的数量 (workerCount),这里可以看到,使用了Integer类型来保存,高3位保存runState,低29位保存workerCount。COUNT_BITS 就是29,CAPACITY就是1左移29位减1(29个1),这个常量表示workerCount的上限值,大约是5亿。
private static int runStateOf(int c) { return c & ~CAPACITY? }
private static int workerCountOf(int c) { return c & CAPACITY? }
private static int ctlOf(int rs, int wc) { return rs | wc? }
runStateOf:获取运行状态;
workerCountOf:获取活动线程数;
ctlOf:获取运行状态和活动线程数的值。
线程池的状态解读
线程池存在5种状态
RUNNING = 1 << COUNT_BITS? //高3位为111
SHUTDOWN = 0 << COUNT_BITS? //高3位为000
STOP = 1 << COUNT_BITS? //高3位为001
TIDYING = 2 << COUNT_BITS? //高3位为010
TERMINATED = 3 << COUNT_BITS? //高3位为011
1、RUNNING
(1) 状态说明:线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理。
(02) 状态切换:线程池的初始化状态是RUNNING。换句话说,线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0!
2、 SHUTDOWN
(1) 状态说明:线程池处在SHUTDOWN状态时,不接收新任务,但能处理已添加的任务。包括处理已经添加到阻塞队列中的任务
(2) 状态切换:调用线程池的shutdown()接口时,线程池由RUNNING -> SHUTDOWN。
3、STOP
(1) 状态说明:线程池处在STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务。
(2) 状态切换:调用线程池的shutdownNow()接口时,线程池由(RUNNING orSHUTDOWN ) -> STOP
4、TIDYING
(1) 状态说明:当所有的任务已终止,ctl记录的”任务数量”为0,线程池会变为TIDYING状态。当线程池变为TIDYING状态时,会执行钩子函数terminated()。terminated()在ThreadPoolExecutor类中是空的,
若用户想在线程池变为TIDYING时,进行相应的处理;可以通过重载terminated()函数来实现。
(2) 状态切换:当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。 当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。
5、 TERMINATED
(1) 状态说明:线程池彻底终止,就变成TERMINATED状态。
(2) 状态切换:线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED。
进入TERMINATED的条件如下:
线程池不是RUNNING状态;
线程池状态不是TIDYING状态或TERMINATED状态;
如果线程池状态是SHUTDOWN并且workerQueue为空;
workerCount为0;
设置TIDYING状态成功。