初探线程池

时间:2022-07-22
本文章向大家介绍初探线程池,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

线程池,顾名思义管理一系列线程的资源池。

与传统的为每一个任务分配一个线程相比,线程池有以下几个优势:

1)其通过重用现有的线程而不是额外创建线程,在处理多个任务时可以分摊线程的创建、销毁开销;

2)由于对于新来的某些任务不需要创建新线程,提高了响应速度

3)线程是一种稀有资源,无休止的创建除了会引发资源耗尽的问题外还会导致资源调度失衡,使用线程池可以便于管理与调度

4)线程池还具有可扩展性,例如ScheduledThreadPool可以定时/延期执行某些任务。

线程池总体架构

线程池内部如下图所示,

上图来自:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html

ThreadPoolExecutor可以分为两部分,任务管理和线程管理。两者之间存在生产者、消费者的关系,任务管理扮演生产者的角色,其将任务放置于任务队列中,而线程管理扮演的是一个消费者的角色,其总是从任务队列中获取任务并交给其手下的一位线程。

此外需要说明的是线程池中的corePool为线程池的基本大小,没有任务需要执行时线程池的大小

线程池的生命周期

如下为线程池内部状态信息,其使用一个AtomicInteger对象,高三位存储当前状态,低29位存储池中线程的数目

    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;