Java ThreadPoolExecutor 深度解析:从原理到实战
在 Java 的多线程编程领域,ThreadPoolExecutor是一个至关重要的工具类,它为开发者提供了强大且灵活的线程池管理能力。合理使用ThreadPoolExecutor,不仅能够提升应用程序的性能和响应速度,还能有效控制资源消耗,避免因线程过多导致的系统崩溃。本文将深入探讨ThreadPoolExecutor的原理、核心参数、工作流程以及实际应用场景,帮助开发者更好地掌握这一利器。
一、ThreadPoolExecutor 的核心概念与原理
1.1 线程池的基本概念
线程池,顾名思义,是一种管理和复用线程的技术。它提前创建一定数量的线程,并将这些线程保存在 “池子” 中。当有任务需要执行时,从线程池中取出一个空闲线程来处理任务;任务执行完毕后,线程不会被销毁,而是归还给线程池,等待下一次任务分配。这种机制避免了频繁创建和销毁线程带来的开销,提高了线程的利用率,从而提升了系统的整体性能。
1.2 ThreadPoolExecutor 的实现原理
ThreadPoolExecutor是 Java 并发包java.util.concurrent中的一个类,它实现了ExecutorService接口,通过一系列的策略和数据结构来管理线程和任务。其核心思想是基于生产者 - 消费者模型:任务提交者(生产者)将任务提交到线程池,线程池中的线程(消费者)从任务队列中获取任务并执行。
ThreadPoolExecutor内部维护了多个关键组件:
- 核心线程池大小(corePoolSize):线程池中保持活动状态的最小线程数量。即使这些线程空闲,也不会被销毁。
- 最大线程池大小(maximumPoolSize):线程池中允许存在的最大线程数量。当任务队列已满且已创建的线程数小于最大线程数时,线程池会创建新的线程来处理任务。
- 任务队列(workQueue):用于存储等待执行的任务。当线程池中的线程都在忙碌时,新提交的任务会被放入任务队列中等待处理。
- 线程工厂(ThreadFactory):用于创建新线程的工厂类。通过自定义线程工厂,可以设置线程的名称、优先级、是否为守护线程等属性。
- 拒绝策略(RejectedExecutionHandler):当任务队列已满且线程数量已达到最大线程池大小时,新提交的任务将由拒绝策略来处理。常见的拒绝策略包括直接抛出异常、丢弃任务、丢弃最旧的任务并执行新任务等。
二、ThreadPoolExecutor 的核心参数详解
2.1 corePoolSize
corePoolSize是线程池中的核心线程数量。在创建ThreadPoolExecutor时,可以通过构造函数指定该参数。当有新任务提交时,如果当前线程池中的线程数量小于corePoolSize,即使有空闲线程,线程池也会创建新的线程来处理任务。例如:
ThreadPoolExecutor executor = new ThreadPoolExecutor( 5, // corePoolSize 10, // maximumPoolSize 60, // keepAliveTime TimeUnit.SECONDS, // unit new ArrayBlockingQueue<>(100), // workQueue Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() ); |
在上述代码中,核心线程池大小被设置为 5,这意味着线程池会至少保持 5 个线程处于活动状态。
2.2 maximumPoolSize
maximumPoolSize定义了线程池中允许存在的最大线程数量。当任务队列已满且已创建的线程数小于maximumPoolSize时,线程池会创建新的线程来处理任务。例如,在上述代码中,最大线程池大小被设置为 10,这表示线程池最多可以创建 10 个线程。
2.3 keepAliveTime 和 unit
keepAliveTime和unit共同决定了非核心线程在空闲状态下的存活时间。当线程池中的线程数量超过corePoolSize时,多余的非核心线程如果在keepAliveTime时间内没有任务可执行,就会被销毁。例如,keepAliveTime为 60,unit为TimeUnit.SECONDS,表示非核心线程在空闲 60 秒后将被销毁。
2.4 workQueue
workQueue是用于存储等待执行任务的队列。ThreadPoolExecutor支持多种类型的任务队列,包括:
- 直接提交队列(SynchronousQueue):该队列不存储任务,每个插入操作都必须等待一个相应的删除操作,反之亦然。当使用SynchronousQueue时,通常需要将maximumPoolSize设置得足够大,以避免任务被拒绝。
- 有界队列(ArrayBlockingQueue、LinkedBlockingQueue 等):有界队列具有固定的容量,当队列已满且线程数量已达到maximumPoolSize时,新提交的任务将触发拒绝策略。
- 无界队列(LinkedBlockingQueue(未指定容量)、PriorityBlockingQueue 等):无界队列理论上可以存储无限数量的任务,当使用无界队列时,maximumPoolSize参数将失去作用,因为线程池中的线程数量不会超过corePoolSize。
2.5 threadFactory
threadFactory是一个用于创建新线程的工厂类。通过自定义threadFactory,可以设置线程的名称、优先级、是否为守护线程等属性,方便调试和管理线程。例如:
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() .setNameFormat("demo-pool-%d") .build(); ThreadPoolExecutor executor = new ThreadPoolExecutor( 5, 10, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy() ); |
上述代码使用ThreadFactoryBuilder创建了一个自定义的线程工厂,线程名称将按照 “demo-pool-% d” 的格式生成。
2.6 rejectedExecutionHandler
rejectedExecutionHandler定义了当任务队列已满且线程数量已达到maximumPoolSize时,新提交任务的处理策略。Java 提供了以下几种内置的拒绝策略:
- AbortPolicy(默认策略):直接抛出RejectedExecutionException异常,阻止系统正常运行。
- CallerRunsPolicy:将任务交给调用execute方法的线程来执行。这种策略可以降低新任务的提交速度,减轻线程池的压力。
- DiscardPolicy:默默丢弃无法处理的任务,不做任何提示。
- DiscardOldestPolicy:丢弃任务队列中最旧的任务,然后尝试提交新任务。
开发者也可以实现RejectedExecutionHandler接口来自定义拒绝策略,以满足特定的业务需求。
三、ThreadPoolExecutor 的工作流程
当一个新任务提交到ThreadPoolExecutor时,其工作流程如下:
- 判断当前线程池中的线程数量是否小于corePoolSize。如果小于,则创建一个新线程来执行任务。
- 如果当前线程数量大于或等于corePoolSize,则将任务放入任务队列中等待执行。
- 如果任务队列已满,且当前线程数量小于maximumPoolSize,则创建一个新线程来执行任务。
- 如果任务队列已满,且当前线程数量已达到maximumPoolSize,则根据设置的拒绝策略来处理新提交的任务。
当线程执行完任务后,它会从任务队列中获取下一个任务继续执行。如果任务队列为空且线程数量超过corePoolSize,多余的非核心线程会在keepAliveTime时间后被销毁,直到线程数量保持在corePoolSize。
四、ThreadPoolExecutor 的应用场景
4.1 高并发业务场景
在高并发的业务场景中,如电商的秒杀活动、金融交易系统等,短时间内会有大量的请求涌入。使用ThreadPoolExecutor可以有效地控制线程数量,避免因创建过多线程导致系统资源耗尽。通过合理设置核心线程池大小、最大线程池大小和任务队列,可以平衡系统的处理能力和资源消耗。
4.2 定时任务处理
ThreadPoolExecutor结合ScheduledExecutorService接口,可以实现定时任务的处理。例如,在一个订单系统中,需要定时扫描超时未支付的订单并进行相应处理。可以使用ScheduledThreadPoolExecutor(ThreadPoolExecutor的子类)来创建定时任务线程池,按照指定的时间间隔执行任务。
4.3 异步任务处理
在 Web 应用程序中,一些耗时的操作(如文件上传、数据导出等)可以使用ThreadPoolExecutor进行异步处理,避免阻塞主线程,提高用户体验。例如,在 Spring Boot 应用中,可以通过配置ThreadPoolTaskExecutor来管理异步任务线程池,在需要异步执行的方法上添加@Async注解即可。
五、最佳实践与注意事项
5.1 参数调优
合理设置ThreadPoolExecutor的参数是发挥其性能优势的关键。在实际应用中,需要根据系统的负载、任务的特点(如任务执行时间、任务提交频率等)来调整核心线程池大小、最大线程池大小、任务队列容量和拒绝策略。例如,对于执行时间较短、提交频率较高的任务,可以适当增大核心线程池大小和任务队列容量;对于执行时间较长的任务,需要谨慎设置最大线程池大小,避免线程过多导致系统资源紧张。
5.2 监控与管理
为了确保线程池的稳定运行,需要对其进行监控和管理。可以通过 JMX(Java Management Extensions)技术获取线程池的运行状态信息,如当前线程数量、任务队列大小、已完成任务数量等。同时,在应用程序中可以添加日志记录,记录线程池的关键操作(如任务提交、线程创建、任务拒绝等),以便在出现问题时进行排查。
5.3 资源释放
在应用程序关闭时,需要正确释放线程池资源,避免资源泄漏。可以调用shutdown或shutdownNow方法来关闭线程池。shutdown方法会等待所有已提交的任务执行完毕后关闭线程池,而shutdownNow方法会尝试停止所有正在执行的任务,并返回等待执行的任务列表。
六、总结
ThreadPoolExecutor作为 Java 多线程编程中的核心组件,为开发者提供了强大而灵活的线程池管理能力。通过深入理解其原理、核心参数、工作流程和应用场景,并遵循最佳实践,开发者可以在各种业务场景中高效地使用线程池,提升应用程序的性能和稳定性。在实际开发中,还需要根据具体需求不断优化和调整线程池的配置,以达到最佳的运行效果。随着业务的发展和系统负载的变化,持续关注线程池的运行状态并进行相应的优化也是必不可少的工作。
相关文章:
Java ThreadPoolExecutor 深度解析:从原理到实战
在 Java 的多线程编程领域,ThreadPoolExecutor是一个至关重要的工具类,它为开发者提供了强大且灵活的线程池管理能力。合理使用ThreadPoolExecutor,不仅能够提升应用程序的性能和响应速度,还能有效控制资源消耗,避免因…...
MCP 协议——AI 世界的“USB-C 接口”:解锁智能协作的新时代
在过去十年中,科技的进步已经改变了我们日常生活的方方面面。从智能手机的普及到物联网的快速发展,人们的生活被各种创新的技术重新定义。今天,我们即将迎来另一个里程碑式的转折点——MCP 协议的推出,它将为人工智能世界的协作与…...
知识就是力量——一些硬件的使用方式
硬件平台 正点原子ATK-MD0430 V2.0(4.3寸TFT LCD电容触摸屏/使用cc2530控制)1.硬件连接2. 软件驱动实现3. 优化与注意事项4. 示例工程参考5. 常见问题 正点原子ATK-MD0430 V2.0(4.3寸TFT LCD电容触摸屏/使用cc2530控制) 1.硬件连…...
机器学习(1)— 开发环境安装
机器学习(1)— 准备开发环境 一、前言 二、Ubuntu开发环境安装 1、NumPy安装 使用如下命令安装: sudo apt-get install python3-numpy2、PyTorch 安装 由于我电脑暂时没有英伟达显卡,暂时安装CPU版: pip3 insta…...
深入实战:使用C++开发高性能RESTful API
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
C++之虚函数 Virtual Function
1. 普通虚函数(Virtual Function) 定义:基类中用 virtual 声明,允许派生类 覆盖(Override)。特点: 基类可提供默认实现。派生类可选择性覆盖(若不覆盖,则调用基类版本&a…...
【java实现+4种变体完整例子】排序算法中【选择排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
以下是选择排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、选择排序基础实现 原理 每一轮遍历未排序部分,找到最小元素并交换到当前起始位置,逐步构建已排序序列。 代码示例 pu…...
DNS主从同步实验
dns域名解析原理 实验步骤1、主dns要完成dns解析:192.168.21.128 [rootlocalhost ~]# yum install bind -y [rootlocalhost ~]# systemctl start named [rootlocalhost ~]# vim /etc/named.conf options { listen-on port 53 { any; }; direct…...
UIjavaScritIU
1、直接执行js脚本:document.documentElement.scrollTop1000 document.getElementById(“su”).click() 弊端: js自己带的元素定位方法不如selenium的丰富 不支持xpath css 等 定位元素操作不是很灵活。 需要借助js脚本传入 -selenium定位 js 负责执行动…...
Manus技术架构、实现内幕及分布式智能体项目实战 线上高级实训班
Manus技术架构、实现内幕及分布式智能体项目实战 线上高级实训班 模块一:解密Manus分布式多智能体工作原理和架构内幕 基于Claude和Qwen的大模型智能体Manus为何能够迅速成为全球讨论热度最高、使用体验最好、产业界最火爆的大模型智能体产品? Ma…...
Java——二维数组
一、概念 二维数组也是一种容器,不同于一维数组,该容器存储的都是一维数组容器。 二、定义格式 1.数据类型[ ] [ ] 变量名; 2.数据类型 变量名 [ ] [ ]; 3.数据类型 [ ] 变量名 [ ]; 三、动态初始化 (一)书写 1.格式 数据…...
豆瓣图书数据采集与可视化分析(一)- 豆瓣图书数据爬取
文章目录 前言一、数据爬取步骤二、豆瓣图书页面分析1. 图书分类标签页面分析2. 图书页面分析 三、数据采集实现1. 图书分类标签数据采集2. 图书数据采集3. 把多个分类的CSV数据文件整合到一个CSV文件中 前言 在当今大数据时代,数据的获取与整理对于各个领域的研…...
车载诊断新架构--- SOVD初入门(上)
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
test——自动化测试
目录 一概念 1自动化 2回归测试 3自动化分类 3.1接口自动化 3.2UI自动化 4自动化测试金字塔 5web自动化测试 6工作原理 二函数 1元素定位 1.1cssSelector 编辑1.2xpath 语法 2操作对象 2.1click() 2.2send_keys() 2.3clear() 2.4text 2.5get_attribu…...
Kubernetes相关的名词解释CoreDNS插件(2)
为什么需要DNS服务? service发现是k8s中的一个重要机制,其基本功能为:在集群内通过服务名对服务进行访问,即需要完成从服务名到ClusterIP的解析。 k8s主要有两种service发现机制:环境变量和DNS。没有DNS服务的时候&am…...
【记录】服务器用命令开启端口号
这里记录下如何在服务器上开启适用于外界访问的端口号。 方法 1 使用防火墙 1 su ,命令 输入密码 切换到root节点 2 开启防火墙 systemctl start firewalld3 配置开放端口 firewall-cmd --zonepublic --add-port8282/tcp --permanent4 重启防火墙 firewall-cmd…...
代码审计入门 原生态sql注入篇
前置知识: 漏洞形成的原因: 1、可控的参数 2、函数缺陷 代码审计的步骤: 1、全局使用正则搜索 漏洞函数 ,然后根据函数看变量是否可控,再看函数是否有过滤 2、根据web的功能点寻找函数,然后根据函数看…...
数据结构0基础学习堆
文章目录 简介公式建立堆函数解释 堆排序O(n logn)topk问题 简介 堆是一种重要的数据结构,是一种完全二叉树,(二叉树的内容后面会出), 堆分为大小堆,大堆,左右结点都小于根节点,&am…...
分析虚幻引擎编辑器中使用 TAA 或 TSR 时角色眨眼导致的眼睛模糊问题
1. 引言 用户反馈在使用虚幻引擎编辑器时,当抗锯齿方法设置为时间性抗锯齿 (TAA) 或时间性超级分辨率 (TSR) 时,角色的眼睛在眨眼时会出现模糊现象。时间性抗锯齿和时间性超级分辨率是现代游戏引擎(包括虚幻引擎)中常用的抗锯齿和…...
捋一遍Leetcode【hot100】的二叉树专题
二叉树专题 除了后面两个,都挺简单 二叉树的中序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int …...
【java实现+4种变体完整例子】排序算法中【堆排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
以下是堆排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、堆排序基础实现 原理 基于二叉堆结构(最大堆),通过以下步骤实现排序: 构建最大堆:将…...
量化交易 - RSRS(阻力支撑相对强度)策略研究 - 源码
一、介绍 RSRS(阻力支撑相对强度)是一种基于价格阻力位与支撑位动态变化的市场择时技术指标,由光大证券在2017年提出。其核心原理是通过量化最高价与最低价之间的线性关系,预测市场趋势变化。 原理: 线性回归建模&a…...
从FPGA实现角度介绍DP_Main_link主通道原理
DisplayPort(简称DP)是一个标准化的数字式视频接口标准,具有三大基本架构包含影音传输的主要通道(Main Link)、辅助通道(AUX)、与热插拔(HPD)。 Main Link:用…...
数据库备份-docker配置主从数据库
创建 Docker Compose 文件 创建一个 docker-compose.yml 文件,定义两个 MySQL 容器(一个主库,一个从库) services:mysql:image: mysql:8.0.27container_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiM…...
YOLO11改进-Backbone-使用MobileMamba替换YOLO backbone 提高检测精度
轻量化模型的技术瓶颈 CNN 的局限性:传统 CNN(如 MobileNet)依赖局部感受野,难以捕捉长距离依赖关系,在高分辨率任务(如语义分割)中需通过增加计算量提升性能,效率低下。 Transforme…...
JavaScript学习教程,从入门到精通,DOM 操作语法知识点及案例代码(20)
DOM 操作语法知识点及案例代码 一、DOM 介绍 1. 什么是 DOM DOM (Document Object Model,文档对象模型) 是 HTML 和 XML 文档的编程接口。它提供了对文档的结构化的表示,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结…...
Vue3 + TypeScript中defineEmits 类型定义解析
TypeScript 中 Vue 3 的 defineEmits 函数的类型定义,用于声明组件可以触发的事件。以下是分步解释: 1. 泛型定义 ts <"closeDialog" | "getApplySampleAndItemX"> 作用:定义允许的事件名称集合,即组…...
Git命令归纳
初始化git git config --global user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中git config --global user.email xxxxxx.com:设置全局邮箱地址,信息记录在~/.gitconfig文件中git init:先创建一个目录&am…...
Oracle Recovery Tools修复ORA-600 6101/kdxlin:psno out of range故障
数据库异常断电,然后启动异常,我接手该库,尝试recover恢复 SQL> recover database; ORA-10562: Error occurred while applying redo to data block (file# 2, block# 63710) ORA-10564: tablespace SYSAUX ORA-01110: ???????? 2: H:\TEMP\GDLISNET\SYSAUX01.DBF O…...
ISO26262-浅谈用例导出方法和测试方法
目录 1 摘要2 测试方法3 测试用例导出方法4 测试方法与用例导出方法的差异和联系5 结论 1 摘要 ISO26262定义了测试方法和用例导出方法,共同保证产品的开发质量。但在刚开始学习ISO26262的时候,又不是非常清晰地理解它俩的区别和联系。本文主要对它俩的…...
小测验——已经能利用数据集里面的相机外参调整后看到渲染图像
文章目录 .1 外try——牛的显示.2 try——衣服的显示.3 原生R,T但是部分显示.4 在.3的基础上加上可视化界面.5 调参后能看到东西的.6 能看一点东西+可视化(pytorch3d).7 自己的代码可视化——需要调整.1 外try——牛的显示 import numpy as np import matplotlib.pyplot as …...
2024期刊综述论文 Knowledge Graphs and Semantic Web Tools in Cyber Threat Intelligence
发表在期刊Journal of Cybersecurity and Privacy上,专门讲知识图谱技术和语义Web工具在网络威胁情报领域的作用,还把本体和知识图谱放在相同的地位上讨论。 此处可以明确一点:本体和知识图谱都可以用于网络威胁情报的应用,当然也…...
文件上传及验证绕过漏洞
目录 一、文件上传常见点 二、客户端--JS绕过--PASS-01 1、环境安装 2、禁用JS 3、后缀名绕过 4、修改前端代码 三、服务端黑名单绕过 1、特殊可解析后缀--PASS-03 2、大小写绕过--PASS-06 3、点绕过--PASS-08 4、空格绕过--PASS-07 5、::$DATA绕过--PASS-09 6、配…...
stack和queue的使用和模拟实现
1:stack文档 stack文档 stack的使用 2:queue文档 queue文档 queue的使用 1:队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。 2:队列作…...
基于Ubuntu2504部署OpenStack E版
OpenStack 初始化环境安装数据库、memcahe、rabbitmq等服务安装keystone服务安装glance服务安装placement服务安装nova服务安装neutron服务安装horizon服务 官网 OpenStack Epoxy 巩固了作为 VMware 替代方案的地位,增强了安全性,并改进了硬件支持 第 3…...
Jsp技术入门指南【七】JSP动作讲解
Jsp技术入门指南【七】JSP动作讲解 前言一、什么是JSP动作?二、核心JSP动作详解1. jsp:include:动态包含其他页面与<% include %>的区别 2. jsp:forward:请求转发到另一个页面3. jsp:param:为动作传递参数4. jsp:useBean&am…...
电脑 访问 github提示 找不到网页,处理方案
1、找到 本机的 host文件 例如 windows 的 一般在 C:\Windows\System32\drivers\etc\hosts 用管理员身份打开 hosts 文件 如果文件中没有 github的配置,需要自己手动添加上去; 如果有,则需要 检查 github.com 与 github.global.ssl.fastly.…...
性能比拼: Elixir vs Go
本内容是对知名性能评测博主 Anton Putra Elixir vs Go (Golang) Performance (Latency - Throughput - Saturation - Availability) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 对比 Elixir 和 Go 简介 许多人长期以来一直要求我对比 Elixir 和 Go。在本视频…...
动手实现文本生成模型:基于 Decoder-only Transformer (PyTorch)
1. 选择框架:PyTorch 我们选择 PyTorch 作为实现框架。PyTorch 提供了灵活的动态图,并且拥有功能强大的 nn.Transformer 模块,方便我们快速构建模型。其社区活跃,资源丰富,是进行深度学习研究和开发的优秀选择。 确保你已经安装了 PyTorch 和其他必要的库: Bash pip i…...
WSL+Ubuntu+miniconda环境配置
安装到指定目录 bash Miniconda3-latest-Linux-x86_64.sh -b -p /usr/local/miniconda3添加环境变量 echo export PATH"/usr/local/miniconda3/bin:$PATH" >> /etc/profile echo export PATH"/usr/local/miniconda3/bin:$PATH" >> ~/.bashrc…...
linux学习 5 正则表达式及通配符
重心应该放在通配符的使用上 正则表达式 正则表达式是用于 文本匹配和替换 的强大工具 介绍两个交互式的网站来学习正则表达式 regexlearn 支持中文 regexone 还有一个在线测试的网址 regex101 基本规则 符号作用示例.匹配任何字符除了换行a.b -> axb/a,b[abc]匹配字符…...
【web服务_负载均衡Nginx】三、Nginx 实践应用与高级配置技巧
一、Nginx 在 Web 服务器场景中的深度应用 1.1 静态网站部署与优化 在 CentOS 7 系统中,使用 Nginx 部署静态网站是最基础也最常见的应用场景。首先,准备网站文件,在/var/www/html目录下创建index.html文件: sudo mkdir -p…...
详解与HTTP服务器相关操作
HTTP 服务器是一种遵循超文本传输协议(HTTP)的服务器,用于在网络上传输和处理网页及其他相关资源。以下是关于它的详细介绍: 工作原理 HTTP 服务器监听指定端口(通常是 80 端口用于 HTTP,443 端口用于 HT…...
LeetCode 2563.统计公平数对的数目:排序 + 二分查找
【LetMeFly】2563.统计公平数对的数目:排序 二分查找 力扣题目链接:https://leetcode.cn/problems/count-the-number-of-fair-pairs/ 给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,返回 公平…...
Manus技术架构、实现内幕及分布式智能体项目实战
Manus技术架构、实现内幕及分布式智能体项目实战 模块一: 剖析Manus分布式多智能体全生命周期、九大核心模块及MCP协议,构建低幻觉、高效且具备动态失败处理能力的Manus系统。 模块二: 解析Manus大模型Agent操作电脑的原理与关键API…...
基于springboot的个人财务管理系统的设计与实现
博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言࿰…...
新能源汽车动力电池热管理方案全解析:开启电车续航与安全的密码
热管理:新能源汽车的隐形守护者 在新能源汽车飞速发展的今天,热管理系统作为保障车辆核心部件稳定运行的关键,正逐渐成为行业关注的焦点。据市场研究机构的数据显示,近年来新能源汽车的销量持续攀升,而与之相伴的是热…...
Ubuntu开启自启动PostgreSQL读取HDD失败处理思路
前置文章: windows通用网线连接ubuntu实现ssh登录、桌面控制、文件共享Ubuntu挂载HDD迁移存储PostgreSQL数据 背景: 启动实体Ubuntu机器后后很大的概率PostgreSQL不会成功启动,查看日志: Ubuntu启动时间: rootPine…...
损失函数总结
目录 回归问题L1损失 平均绝对值误差(MAE)Smooth L1 LossL2损失 均方误差损失MSE 分类问题交叉熵损失KL 散度损失 KLDivLoss负对数似然损失 NLLLoss 排序MarginRankingLoss 回归问题 L1损失 平均绝对值误差(MAE) 指模型预测值f(x…...
LeetCode 热题 100:回溯
46. 全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入ÿ…...