参考链接:https://www.zhihu.com/question/29971107/answer/284794885

    首先,我这里贴张图,帮助你理解下线程池的工作任务的处理流程。
    image.png
    在向线程池提交任务时,如果核心线程已满、队列已满且线程池最大线程数未满时,就会创建出题主所说的“大于corePoolsize的多出线程”。这里通过源代码来说明下(jdk1.8.0_101):
    image.png
    再来说说 keepAliveTime,这个参数是用来控制,超出 corePoolSize 的线程在这个时间还没有可执行的任务时,则自动退出(线程销毁),上边说到了调用 addWorker 创建线程,这里看看 addWorker 方法
    image.png
    线程启动后就会调用Worker对象的run方法:
    image.png
    runWoker方法就是线程从队列里拿任务开始干活,如果等了keepAliveTime还没有任务并且线程数大于coreSizePoll,则线程就会执行完毕退出。
    image.png
    接下来再看看getTask方法,这里就是判断keepAliveTime的关键了
    image.png