Dubbo的线程池策略

1 Dubbo的线程池概述

这里将要讲述的线程池指Dubbo服务端使用某些线程模型(如 all 模型)时用到的业务线程池。ThreadPool 是一个扩展接口SPI。

@SPI(value = "fixed", scope = ExtensionScope.FRAMEWORK)
public interface ThreadPool {/*** Thread pool** @param url URL contains thread parameter* @return thread pool*/@Adaptive({THREADPOOL_KEY})Executor getExecutor(URL url);}

Dubbo提供了一些基于JDK的标准ThreadPoolExecutor的接口实现,具体如下。

  • FixedThreadPool:创建一个线程数固定的线程池。
  • LimitedThreadPool:创建一个线程池,线程池中的线程个数随着需要量动态增加,但是数量不超过配置的阈值。另外空闲线程不会被回收,会一直存在。
  • EagerThreadPool:创建一个线程池,当所有核心线程都忙碌时,将创建新线程来执行新任务,而不是把任务放入线程池的阻塞队列中。
  • CachedThreadPool:创建一个自适应线程池。当线程空闲1min时,线程会被回收;当有新请求到来时,会创建新线程。

默认情况下,Dubbo 会使用线程数固定的线程池(FixedThreadPool)。

2 源码分析

2.1 FixedThreadPool

创建一个线程数固定的线程池。源码如下所示。

public class FixedThreadPool implements ThreadPool {@Overridepublic Executor getExecutor(URL url) {// 线程名称的前缀,默认值为"Dubbo"String name = url.getParameter(THREAD_NAME_KEY, (String) url.getAttribute(THREAD_NAME_KEY, DEFAULT_THREAD_NAME));// 线程的数量,默认为200int threads = url.getParameter(THREADS_KEY, DEFAULT_THREADS);// 线程池阻塞队列的大小,默认值为0int queues = url.getParameter(QUEUES_KEY, DEFAULT_QUEUES);BlockingQueue<Runnable> blockingQueue;if (queues == 0) {blockingQueue = new SynchronousQueue<>();} else if (queues < 0) {blockingQueue = new MemorySafeLinkedBlockingQueue<>();} else {blockingQueue = new LinkedBlockingQueue<>(queues);}return new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS, blockingQueue,new NamedInternalThreadFactory(name, true), new AbortPolicyWithReport(name, url));}}

其中使用的拒绝策略为 AbortPolicyWithReport,其继承了JDK的ThreadPoolExecutor.AbortPolicy,其作用是当线程池中的线程处于忙碌状态且线程池队列已满时,新来的任务会被丢弃,并抛出RejectedExecutionException异常。具体如下所示。

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {String msg = String.format("Thread pool is EXHAUSTED!" +" Thread Name: %s, Pool Size: %d (active: %d, core: %d, max: %d, largest: %d)," +" Task: %d (completed: %d)," +" Executor status:(isShutdown:%s, isTerminated:%s, isTerminating:%s), in %s://%s:%d!",threadName, e.getPoolSize(), e.getActiveCount(), e.getCorePoolSize(), e.getMaximumPoolSize(),e.getLargestPoolSize(),e.getTaskCount(), e.getCompletedTaskCount(), e.isShutdown(), e.isTerminated(), e.isTerminating(),url.getProtocol(), url.getIp(), url.getPort());// 0-1 - Thread pool is EXHAUSTED!logger.warn(COMMON_THREAD_POOL_EXHAUSTED, "too much client requesting provider", "", msg);// 获取当前 JVM 进程的线程堆栈跟踪信息// 依赖 java.lang.management.ThreadMXBean 访问Java虚拟机线程信息if (Boolean.parseBoolean(url.getParameter(DUMP_ENABLE, "true"))) {dumpJStack();}dispatchThreadPoolExhaustedEvent(msg);throw new RejectedExecutionException(msg);
}

2.2  LimitedThreadPool

2.3 EagerThreadPool

2.4 CachedThreadPool

3 线程池的确定时机

4 自定义线程池策略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/734307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习的苹果叶片病害检测系统(含UI界面、yolov8、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 可以任意更换主干结构&#xff0c;支持几百种网络主干。 数据集&#xff1a;     网上下载的数据集&#x…

基于极大似然算法的系统参数辨识matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于极大似然算法的系统参数辨识。对系统的参数a1&#xff0c;b1&#xff0c;a2&#xff0c;b2分别进行估计&#xff0c;计算估计误差以及估计收敛曲线&#xff0…

使用yarn创建vite+vue3electron多端运行

文章目录 第一步 使用yarn创建vite+vue3项目遇到创建报错看第二步 引入electron第三步 创建main.js在electron下面的main.js写入下面代码第四步 安装同时运行多条命令npm包&&修改package.json文件npm包增加一条electron运行脚本命令效果图第一步 使用yarn创建vite+vue3…

【pytorch可视化工具】

TensorboardX 在PyTorch中&#xff0c;模型训练的可视化通常通过TensorBoard或Visdom等工具实现。以下是如何使用TensorBoard进行模型训练可视化的步骤&#xff1a; 使用TensorboardX与PyTorch配合 确保已经安装了tensorboard和tensorboardX库。 pip install tensorboard p…

springboot Mongo大数据查询优化方案

前言 因为项目需要把传感器的数据保存起来&#xff0c;当时设计的时是mongo来存储&#xff0c;后期需要从mongo DB里查询传感器的数据记录。由于传感器每秒都会像mongo数据库存500条左右的数据&#xff0c;1天就有4320万条数据&#xff0c;要想按照时间条件去查询&#xff0c;…

【数据可视化】动手用matplotlib绘制关联规则网络图

下载文中数据、代码、绘图结果 文章目录 关于数据绘图函数完整可运行的代码运行结果 关于数据 如果想知道本文的关联规则数据是怎么来的&#xff0c;请阅读这篇文章 绘图函数 Python中似乎没有很方便的绘制网络图的函数。 下面是本人自行实现的绘图函数&#xff0c;如果想…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)

项目建议与立项申请、初步可行性研究、详细可行性研究、评估与决策是项目投资前使其的四个阶段。在实际工作中&#xff0c;初步可行性研究和详细可行性研究可以依据项目的规模和繁简程度合二为一&#xff0c;但详细可行性研究是不可缺少的。升级改造项目制作初步和详细研究&…

windows11配置电脑IP

windows11配置电脑IP 选择"开始>设置>“网络&Internet >以太网”。在 "属性"下&#xff0c;编辑IP地址&#xff0c;子网掩码&#xff0c;网关以及DNS。

数据库系统原理实验报告1 | E-R图设计

整理自博主2021级专业课《数据库系统原理》自己完成的实验报告。 目录 一、实验目的 二、实验内容 1、某个学校有若干个系 2、某工厂生产若干产品 3、某学校的田径运动会中设置了各类比赛 4、自己调查一个需要提供开发数据库应用系统的单位 三、实验结果总结 四、实验结…

C# sort面试题目

在C#的面试中&#xff0c;排序是一个常见的主题&#xff0c;因为它不仅涉及对集合的基本操作&#xff0c;也反映了应聘者对算法和数据结构的理解。以下是一些关于C#排序的面试题目&#xff1a; 解释C#中List<T>.Sort()方法和Array.Sort()方法的不同之处。 List<T>…

Java中常用的集合及方法(2)

在Java&#xff08;JDK8&#xff09;中&#xff0c;集合&#xff08;Collection&#xff09;是数据结构的实现&#xff0c;用于存储和操作对象集合。 集合&#xff08;Collection&#xff09;中包含的一般类或接口&#xff1a; 在这其中呢&#xff0c;我们经常使用的其实就是L…

第二十二 查询、检索、搜索

查询在计算机中十分广泛的应用。 在字符串或者文本文件中查询关键字&#xff0c;模式匹配&#xff0c;正则表达式。在数组、树、哈希表等数据结构中查询指定数据在数据库中查询在海量非结构文件中查询搜索引擎 模式匹配 模式匹配是数据结构中字符串的一种基本运算&#xff0…

API 设计的原则

我在 Thoughtworks 上曾经读到过一篇文章《API 设计的几条原则》我觉得写得非常不错&#xff0c;链接我放底下&#xff0c;推荐阅读。 在我多年的工作历程中&#xff0c;我深刻意识到 API 的设计至关重要&#xff0c;但是我发现&#xff0c;在一般的组织中&#xff0c;API 的设…

K8S - 在任意node里执行kubectl 命令

当我们初步安装玩k8s &#xff08;master 带 2 nodes&#xff09; 时 正常来讲kubectl 只能在master node 里运行 当我们尝试在某个 node 节点来执行时&#xff0c; 通常会遇到下面错误 看起来像是访问某个服务器的8080 端口失败了。 原因 原因很简单 , 因为k8s的各个组建&…

外包干了6天后悔了,技术明显进步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

chrome高内存占用问题

chrome号称内存杀手不是盖的&#xff0c;不设设置的话&#xff0c;经常被它内存耗尽死机是常事。以下自用方法 1 自带的memory saver chrome://settings/performance PerformanceMemory Saver When on, Chromium frees up memory from inactive tabs. This gives active tab…

利用SQL Server 进行报表统计的关键SQL语句与函数

在数据库应用中&#xff0c;报表统计是一项至关重要的任务&#xff0c;它为企业提供了数据洞察和决策支持。SQL Server作为一种强大的关系型数据库管理系统&#xff0c;提供了丰富的SQL语句和函数&#xff0c;可用于高效地进行报表统计。本文将介绍一些常用的SQL语句和函数&…

基于Springboot的在线租房和招聘平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的在线租房和招聘平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

python基础——条件判断和循环【if,while,for,range】

&#x1f4dd;前言&#xff1a; 这篇文章主要讲解一下条件判断语句if和循环语句while&#xff0c;for在python中需要注意的地方。 建议已有一定了解&#xff08;对语句的执行逻辑清楚&#xff09;的读者观看&#xff0c;如果对条件判断和循环的执行逻辑不太清楚&#xff0c;也可…

设计模式--装饰器模式(Decorator Pattern)

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你在运行时动态地将行为添加到对象中。在装饰器模式中&#xff0c;这些新的行为通常对应于添加的责任。装饰器提供了比继承更有弹性的替代方案。 装饰器模式主要包含以下几个角色&…