什么是线程?
    线程是进程分配的最小执行单元。

    什么是进程?
    进程是操作系统进行调度和资源分配的最小单位。

    什么是池化技术?
    池化技术简单来见,就是有个池子,就是一个容器,创建了某种对象,可以放到池子里,等待下次取用。用完之后再回到池子(如果对象有状态,需要清空状态数据)。
    这么做有什么好处呢?俩字:复用。
    为什么要复用?因为创建对象的代价昂贵。
    为什么JVM的对象不这么做?因为创建对象的代价不昂贵且可复用场景不多。
    什么对象这么昂贵?一般是消耗了操作系统相关的资源的操作,比如线程、socket链接。

    创建线程昂贵在哪里?

    • 必须为线程堆栈分配和初始化大量内存块。(分配内存,内存是有限资源)
    • 需要进行系统调用,以便在主机OS中创建/注册本机线程。(系统调用,上下文切换)
    • 描述符需要创建、初始化并添加到JVM内部数据结构中。

    扩展:线程切换开销在哪里?
    线程切换时,必然需要将旧线程的task_struct从内核切出,将新线程的切入,带来上下文切换。除此之外,还需要切换寄存器、程序计数器、线程栈(包括操作栈、数据栈)等。

    执行顺序?

    • 当线程池中线程数小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
    • 当线程池中线程数达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行 。
    • 当workQueue已满,且maximumPoolSize > corePoolSize时,新提交任务会创建新线程执行任务。
    • 当workQueue已满,且提交任务数超过maximumPoolSize,任务由RejectedExecutionHandler处理。
    • 当线程池中线程数超过corePoolSize,且超过这部分的空闲时间达到keepAliveTime时,回收这些线程。