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

一.jdk线程池策略

先说下步骤

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

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

3.当工作线程>=corePoolSize,<maximumPoolSize,添加任务,但是workQueue也满了,新建线程,添加到workSet中执行,

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

二.Tomcat线程池策略 

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

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

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

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

 

三.Dubbo饥饿线程池策略

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

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

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

四.总结

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值