线程池,顾名思义管理一系列线程的资源池。
与传统的为每一个任务分配一个线程相比,线程池有以下几个优势:
1)其通过重用现有的线程而不是额外创建线程,在处理多个任务时可以分摊线程的创建、销毁开销;
2)由于对于新来的某些任务不需要创建新线程,提高了响应速度
3)线程是一种稀有资源,无休止的创建除了会引发资源耗尽的问题外还会导致资源调度失衡,使用线程池可以便于管理与调度
4)线程池还具有可扩展性,例如ScheduledThreadPool可以定时/延期执行某些任务。
线程池总体架构
线程池内部如下图所示,
上图来自:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html
ThreadPoolExecutor可以分为两部分,任务管理和线程管理。两者之间存在生产者、消费者的关系,任务管理扮演生产者的角色,其将任务放置于任务队列中,而线程管理扮演的是一个消费者的角色,其总是从任务队列中获取任务并交给其手下的一位线程。
此外需要说明的是线程池中的corePool为线程池的基本大小,没有任务需要执行时线程池的大小
线程池的生命周期
如下为线程池内部状态信息,其使用一个AtomicInteger对象,高三位存储当前状态,低29位存储池中线程的数目
代码语言:javascript复制 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
// runState is stored in the high-order bits
private static final int RUNNING = -1 << COUNT_BITS;
private static final int SHUTDOWN = 0 << COUNT_BITS;
private static final int STOP = 1 << COUNT_BITS;
private static final int TIDYING = 2 << COUNT_BITS;
private static final int TERMINATED = 3 << COUNT_BITS;