I、UMLII、依赖III、运行进程IV、生命周期运行statedescRUNNING可以接收新任务,可以处理队列中的任务SHUTDOWN不能接收新任务,但是可以继续处理队列中的TaskSTOP无法处理队列中的新任务和任务,处理该任务的线程将被中断。TIDYING所有任务都已终止。TERMINATED终止后的状态V,任务调度1.首先查看线程池的运行状态,如果不是RUNNING,直接拒绝,线程池必须保证任务在RUNNING状态下执行。2.如果workerCount=corePoolSize,并且线程池中的阻塞队列未满,则将任务添加到阻塞队列中。4、如果workerCount>=corePoolSize&&workerCount=maximumPoolSize,并且线程池中的阻塞队列已满,任务将按照拒绝策略进行处理,默认的处理方式是直接抛出异常。VI、Worker1,task为Runnable(内部变量名为task或command),thread为Worker。2.worker持有一个线程thread3。Worker继承AQS,使用AQS实现排他锁的功能。没有使用ReentrantLock,而是使用AQS实现不可重入的特性来反映线程当前的执行状态。——一旦lock方法获取到了独占锁,就意味着当前线程正在执行一个任务。-如果正在执行任务,则不应中断线程。——如果线程不是处于排他锁状态,即处于空闲状态,则表示没有在处理任务,此时可以中断线程。——线程池在执行shutdown方法或tryTerminate方法时,会调用interruptIdleWorkers方法中断空闲线程。interruptIdleWorkers方法会使用tryLock方法判断线程池中的线程是否空闲;如果线程空闲,则可以安全地回收它。四、执行任务流程七、需要注意和验证的几个重要知识点1、线程池初始化线程数可以动态调整。小时调整任务会重新进入for循环。验证扩大和缩小任务是否有影响。2、线程池一方面避免了处理任务时创建和销毁线程的开销。另一方面避免了线程数量膨胀带来的过度调度问题,保证了核心的充分利用。创建和销毁线程的开销,以及调度线程的开销。如何验证这两项费用???3、线程设置过多也可能导致线程上下文切换频繁,也会降低处理任务的速度,降低吞吐量???或者如何验证开销???4、最大核数设置过小,大量抛出RejectedExecutionExceptions,触发接口降级条件。也就是说,它是一种动态降级方案。5、队列设置过长,最大线程数设置无效。结果,当请求数量增加时,队列中堆积了大量任务,任务执行时间过长。在嵌套的线程池中,会不会第一层的任务执行完毕,与之相关联的第二层的任务在等待,导致响应时间很长???八。参考文章:https://www.javadoop.com/post/java-thread-poolhttps://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html