JDK线程池的工作流程

一、流程简介

① 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务
② 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列
③ 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么要创建非核心线程立刻运行这个任务
④ 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常RejectExecutionException

二、缺点说明

如果队列是无界阻塞队列,当线程数量过大会有内存溢出发生,且maximumPoolSize没有意义

三、名词解析

corePoolSize:核心线程数
maximumPoolSize:最大线程数

四、如何保证线程池的核心线程不被销毁

当有新任务来的时候,先看看当前的线程数有没有超过核心线程数,如果没超过就直接新建一个线程来执行新的任务,如果超过了就看看缓存队列有没有满,没满就将新任务放进缓存队列中,满了就新建一个线程来执行新的任务,如果线程池中的线程数已经达到了指定的最大线程数了,那就根据相应的策略拒绝任务。

当缓存队列中的任务都执行完了的时候,线程池中的线程数如果大于核心线程数,就销毁多出来的线程,直到线程池中的线程数等于核心线程数。此时这些线程就不会被销毁了,它们一直处于阻塞状态,等待新的任务到来。

线程池根本没对任何线程进行特殊标记核心与非核心,也没有核心线程不被销毁的说法,线程池只是销毁多余的空闲线程而已

你可能感兴趣的:(JDK线程池的工作流程)