聊一下不同应用线程池策略(jdk,tomcat,dubbo)

一.jdk线程池策略

先说下步骤

1.当工作线程数少于corePoolSize,添加任务时,会直接创建一个线程,添加到workSet中。

2.当工作线程数>=corePoolSize,添加任务,会添加到工作对列workQueue中阻塞,等待workSet中的线程空闲出来挨个执行。

3.当工作线程>=corePoolSize,

4.当工作线程=maximumPoolSize,工作对列也满了,就会执行拒绝策略。

聊一下不同应用线程池策略(jdk,tomcat,dubbo)_第1张图片

二.Tomcat线程池策略 

         tomcat线程池策略和Dubbo的饥饿线程池逻辑差不多,只是实现不同。因为应用服务器或者RPC注重响应时间和资源占用,资源占用越少越好,响应时间越短越好,吞吐量越大越好。而jdk线程池,在核心线程用完后,就只能通过添加阻塞队列,而tomcat和dubbo为了保证响应速度,工作线程数只要不大于最大线程数,优先创建线程,创建不了了才会添加到阻塞对列中。而tomcat和dubbo不会利用核心线程池比较,都会记录一个提交任务数(提交未处理的+正在处理中的),会通过提交数和工作线程数量进行比较,提交数<工作线程数,就会创建线程。

Tomcat自己实现的ThreadPoolExecutor,继承自jdk的ThreadPoolExecutor,重写了execute和afterExecute方法,增加submittedCount变量对任务进行计数,execute任务计数+1,afterExecute任务计数-1。

聊一下不同应用线程池策略(jdk,tomcat,dubbo)_第2张图片

聊一下不同应用线程池策略(jdk,tomcat,dubbo)_第3张图片

 Tomcat自己的TaskQueue,继承自jdk的LinkedBlockingQueue,重写了offer方法 。

聊一下不同应用线程池策略(jdk,tomcat,dubbo)_第4张图片

聊一下不同应用线程池策略(jdk,tomcat,dubbo)_第5张图片

tomcat线程池创建时还会预热,提前将核心线程初始化好。

聊一下不同应用线程池策略(jdk,tomcat,dubbo)_第6张图片 

三.Dubbo饥饿线程池策略

 Dubbo饥饿线程池策略和tomcat差不多,写法都有点像。

EagerThreadPoolExecutor继承自jdk的ThreadPoolExecutor,其实和tomcat结构差不多,也是重写execute、和afterExecute方法,增减任务计数。 

聊一下不同应用线程池策略(jdk,tomcat,dubbo)_第7张图片

TaskQueue也是继承LinkedBlockingQueue,逻辑也差不多,判断先后不一样。 

聊一下不同应用线程池策略(jdk,tomcat,dubbo)_第8张图片

四.总结

1.tomcat和dubbo的饥饿线程池都是扩展自jdk线程池,阻塞队列也进行了扩展。

2.tomcat线程池初始化会预热核心线程

3.tomcat/dubbo饥饿线程池当前线程数小于核心数时,添加任务会创建新线程,直到核心线程数够了,当当前线程数大于核心线程数时,添加任务会利用空闲线程,没有空闲线程才会添加阻塞队列。但是tomcat特殊点,因为核心线程已经提前预热完了。

你可能感兴趣的:(java,dubbo,tomcat)