JDK线程池
JDK 实现的这个线程池优先把任务放入队列暂存起来,而不是创建更多的线程,它比较适用于执行 CPU 密集型的任务,也就是需要执行大量 CPU 运算的任务。这是为什么呢?因为执行 CPU 密集型的任务时 CPU 比较繁忙,因此只需要创建和 CPU 核数相当的线程就好了,多了反而会造成线程上下文切换,降低任务执行效率。所以当前线程数超过核心线程数时,线程池不会增加线程,而是放在队列里等待核心线程空闲下来。Tomcat线程池
我们平时开发的 Web 系统通常都有大量的 IO 操作,比方说查询数据库、查询缓存等等。任务在执行 IO 操作的时候 CPU 就空闲了下来,这时如果增加执行任务的线程数而不是把任务暂存在队列中,就可以在单位时间内执行更多的任务,大大提高了任务执行的吞吐量。所以Tomcat 使用的线程池对 JDK 原生的线程池做了一些改造,当线程数超过 coreThreadCount 之后会优先创建线程,直到线程数到达 maxThreadCount
Tomcat对JDK线程的改造
定制化队列TaskQueue
TaskQueue重写offer方法
核心excute方法其实主要逻辑是调用父类方法
父类方法逻辑
拒绝重试
force方法
总结
1、检查如果没有传入ThreadPoolExecutor的引用,那么就还是直接放入队列(相当于与原生线程池的流程一致)。 2、检查如果当前已经是最大线程数了,就还是得放入队列中 3、如果提交的任务数小于当前线程数,则说明有空闲的线程,则添加到队列中也会被立刻获取走, 执行是在:Worker的runWorker方法中的getTask 4、重点:当前线程数少于最大线程数,返回false,去创建新的Worker



