美团开源动态线程池

/ 后端 / 没有评论 / 724浏览

https://github.com/dromara/dynamic-tp

#JUC线程池 因为Tomcat线程池主要是来做IO任务的,做这一切的目的主要也是为了以最小代价的改动更好的支持IO密集型的场景,JUC自带的线程池主要是适合于CPU密集型的场景,可以回想一下JUC原生线程池ThreadPoolExecutor#execute()方法的执行流程

1.判断如果当前线程数小于核心线程池,则新建一个线程来处理提交的任务 2.如果当前线程数大于核心线程数且队列没满,则将任务放入任务队列等待执行 3.如果当前当前线程池数大于核心线程池,小于最大线程数,且任务队列已满,则创建新的线程执行提交的任务 4.如果当前线程数等于最大线程数,且队列已满,则拒绝该任务

tomcat线程池

可以看出当当前线程数大于核心线程数时,JUC原生线程池首先是把任务放到队列里等待执行,而不是先创建线程执行。 如果Tomcat接收的请求数量大于核心线程数,请求就会被放到队列中,等待核心线程处理,这样会降低请求的总体处理速度,所以Tomcat并没有使用JUC原生线程池,利用TaskQueue的offer()方法巧妙的修改了JUC线程池的执行流程,改写后Tomcat线程池执行流程如下:

1.判断如果当前线程数小于核心线程池,则新建一个线程来处理提交的任务 2.如果当前当前线程池数大于核心线程池,小于最大线程数,则创建新的线程执行提交的任务 3.如果当前线程数等于最大线程数,则将任务放入任务队列等待执行 4.如果队列已满,则执行拒绝策略