当前位置: 首页 > news >正文

并发设计模式实战系列(4):线程池

🌟 ​大家好,我是摘星!​ 🌟

今天为大家带来的是并发设计模式实战系列,第四章线程池(Thread Pool)​,废话不多说直接开始~


目录

一、核心原理深度拆解

1. 线程池核心组件

2. 核心参数解析

二、生活化类比:银行柜台服务

三、Java代码实现(生产级Demo)

1. 完整可运行代码

2. 关键配置说明

四、横向对比表格

1. 线程池实现方案对比

2. 队列策略性能对比

五、高级优化技巧

1. 动态参数调整

2. 监控指标采集

3. 异常处理机制

六、设计模式对比

七、生产环境最佳实践

1. 参数配置黄金法则

2. Spring集成方案

八、故障排查手册

1. 常见问题诊断表

2. 诊断代码片段

九、未来演进方向

1. 虚拟线程(Project Loom)

2. 响应式编程整合

十、行业应用案例

1. 电商秒杀系统

2. 金融交易系统

十一、性能压测数据

1. 不同队列策略对比测试

2. 线程数优化对比

十二、安全防护策略

1. 资源隔离方案

2. 防雪崩机制


一、核心原理深度拆解

1. 线程池核心组件

┌───────────────┐       ┌───────────────┐       ┌───────────────┐
│  任务提交       │───>   │  任务队列       │───>   │  工作线程       │
│ (应用程序)      │<───   │ (BlockingQueue) │<───   │ (Thread复用)    │
└───────────────┘       └───────────────┘       └───────────────┘
  • 线程复用机制:通过预先创建线程避免频繁创建/销毁开销
  • 流量控制:队列容量和最大线程数双重限制防止资源耗尽
  • 任务调度策略:核心线程常驻,队列满时扩容,最大线程满时触发拒绝策略

2. 核心参数解析

  • corePoolSize:常驻线程数(CPU密集型建议N+1)
  • maximumPoolSize:最大应急线程数(IO密集型建议2N+1)
  • keepAliveTime:非核心线程空闲存活时间
  • workQueue:缓冲队列(直接影响系统吞吐能力)
  • RejectedPolicy:系统过载时的保护策略

二、生活化类比:银行柜台服务

线程池组件

银行服务类比

核心规则

核心线程

常驻柜台窗口

始终保持开放的服务窗口

任务队列

客户等候区

先到先服务,容量有限

最大线程数

应急备用窗口

客流高峰时临时开放

拒绝策略

客流超限处理方案

婉拒新客/引导自助办理

  • 典型场景:常规客户(核心线程处理)→ 高峰客流(队列缓冲)→ 极端情况(启用应急窗口)→ 超负荷(拒绝服务)

三、Java代码实现(生产级Demo)

1. 完整可运行代码

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;public class ThreadPoolDemo {// 监控指标private static final AtomicInteger completedTasks = new AtomicInteger(0);// 生产环境推荐使用ThreadPoolExecutor构造private static final ExecutorService pool = new ThreadPoolExecutor(4, // 核心线程数(对应4核CPU)8, // 最大线程数(4核*2)30, TimeUnit.SECONDS,new ArrayBlockingQueue<>(100), // 固定容量队列new CustomThreadFactory(),     // 自定义线程命名new CustomRejectionPolicy()    // 自定义拒绝策略);// 自定义线程工厂static class CustomThreadFactory implements ThreadFactory {private final AtomicInteger counter = new AtomicInteger(1);@Overridepublic Thread newThread(Runnable r) {return new Thread(r, "BizPool-Thread-" + counter.getAndIncrement());}}// 自定义拒绝策略static class CustomRejectionPolicy implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {System.err.println("触发拒绝策略!任务总数: " + executor.getTaskCount());if (!executor.isShutdown()) {r.run(); // 由调用线程直接执行}}}public static void main(String[] args) throws InterruptedException {// 模拟任务提交for (int i = 0; i < 200; i++) {final int taskId = i;pool.submit(() -> {try {// 模拟业务处理(IO密集型)Thread.sleep(50);completedTasks.incrementAndGet();System.out.println(Thread.currentThread().getName() + " 完成任务: " + taskId);} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}// 平滑关闭pool.shutdown();pool.awaitTermination(1, TimeUnit.MINUTES);System.out.println("总完成任务数: " + completedTasks.get());}
}

2. 关键配置说明

// 队列选择策略对比:
new ArrayBlockingQueue<>(100)    // 固定容量,防止无限制膨胀
new LinkedBlockingQueue()        // 默认无界队列(慎用)
new SynchronousQueue()           // 直接传递,无缓冲能力// 拒绝策略选择:
ThreadPoolExecutor.AbortPolicy   // 默认策略,抛出异常
ThreadPoolExecutor.CallerRunsPolicy  // 由提交线程执行
ThreadPoolExecutor.DiscardOldestPolicy // 抛弃队列最旧任务
ThreadPoolExecutor.DiscardPolicy      // 直接抛弃新任务

四、横向对比表格

1. 线程池实现方案对比

实现类

特点

适用场景

FixedThreadPool

固定线程数+无界队列

已知任务量的批处理

CachedThreadPool

弹性线程数+同步队列

短时突发请求

SingleThreadPool

单线程+无界队列

需要顺序执行任务

ScheduledPool

支持定时/周期任务

定时任务调度

ForkJoinPool

工作窃取算法

分治任务/并行计算

2. 队列策略性能对比

队列类型

吞吐量

资源消耗

任务响应延迟

SynchronousQueue

最低

ArrayBlockingQueue

稳定

LinkedBlockingQueue

波动较大

PriorityBlockingQueue

依赖排序


五、高级优化技巧

1. 动态参数调整

ThreadPoolExecutor pool = (ThreadPoolExecutor) Executors.newCachedThreadPool();
// 实时调整核心参数
pool.setCorePoolSize(8);         // 根据负载动态调整
pool.setMaximumPoolSize(32);
pool.setKeepAliveTime(60, TimeUnit.SECONDS);

2. 监控指标采集

// 获取运行时状态
int activeCount = pool.getActiveCount();
long completed = pool.getCompletedTaskCount();
int queueSize = pool.getQueue().size();// 计算线程池利用率
double utilization = (double)activeCount / pool.getMaximumPoolSize();

3. 异常处理机制

// 使用包装任务捕获异常
pool.submit(() -> {try {businessLogic();} catch (Exception e) {log.error("任务执行异常", e);}
});// 通过UncaughtExceptionHandler全局捕获
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {System.err.println("线程" + t.getName() + "发生异常: " + e);
});

六、设计模式对比

模式

资源利用率

响应速度

系统稳定性

实现复杂度

Thread-Per-Message

简单

Worker Thread

中等

Producer-Consumer

复杂

Thread Pool

最高

中等


七、生产环境最佳实践

1. 参数配置黄金法则

// CPU密集型任务(加密计算/图像处理)
int corePoolSize = Runtime.getRuntime().availableProcessors() + 1;
int maxPoolSize = corePoolSize * 2;// IO密集型任务(网络请求/数据库操作)
int corePoolSize = Runtime.getRuntime().availableProcessors() * 2;
int maxPoolSize = corePoolSize * 4;// 混合型任务(推荐动态调整)
ThreadPoolExecutor pool = new ThreadPoolExecutor(initialCoreSize, maxSize,60, TimeUnit.SECONDS,new ResizableCapacityQueue<>(1000) // 自定义可变容量队列
);

2. Spring集成方案

@Configuration
public class ThreadPoolConfig {@Bean("bizThreadPool")public ExecutorService bizThreadPool() {return new ThreadPoolExecutor(8, 32,60, TimeUnit.SECONDS,new LinkedBlockingQueue<>(10000),new CustomThreadFactory(),new CustomRejectHandler());}@Bean("schedulePool")public ScheduledExecutorService schedulePool() {return new ScheduledThreadPoolExecutor(4,new CustomThreadFactory(),new ThreadPoolExecutor.DiscardPolicy());}
}

八、故障排查手册

1. 常见问题诊断表

现象

可能原因

排查工具

解决方案

CPU占用率100%

死循环/锁竞争

arthas thread -n 3

检查线程栈定位热点代码

内存持续增长

任务队列无限堆积

jstat -gcutil

设置合理队列容量/拒绝策略

请求响应变慢

线程池满+队列积压

pool.getQueue().size()

动态扩容/优化任务处理速度

线程创建失败

超出系统线程数限制

ulimit -u

调整最大用户进程数限制

2. 诊断代码片段

// 实时监控线程池状态
public void printPoolStatus(ThreadPoolExecutor pool) {System.out.printf("活跃线程: %d / 核心线程: %d / 最大线程: %d / 队列大小: %d%n",pool.getActiveCount(),pool.getCorePoolSize(),pool.getMaximumPoolSize(),pool.getQueue().size());
}// 内存队列诊断
if (pool.getQueue() instanceof LinkedBlockingQueue) {LinkedBlockingQueue<?> queue = (LinkedBlockingQueue<?>) pool.getQueue();System.out.println("队列剩余容量: " + queue.remainingCapacity());
}

九、未来演进方向

1. 虚拟线程(Project Loom)

// 使用虚拟线程池(JDK19+)
ExecutorService vtPool = Executors.newVirtualThreadPerTaskExecutor();// 与传统线程池对比
┌──────────────────────┬─────────────────────────────┐
│ 传统线程池            │ 虚拟线程池                   │
├──────────────────────┼─────────────────────────────┤
│ 1线程对应1OS线程      │ 1虚拟线程对应1载体线程          │
│ 上下文切换成本高       │ 用户态轻量级切换               │
│ 适合CPU密集型任务      │ 适合高并发IO密集型任务          │
└──────────────────────┴─────────────────────────────┘

2. 响应式编程整合

// Reactor + 线程池调度
Flux.range(1, 1000).parallel().runOn(Schedulers.fromExecutor(pool))  // 绑定自定义线程池.doOnNext(i -> processData(i)).subscribe();

十、行业应用案例

1. 电商秒杀系统

请求处理流程:
用户请求 → 令牌桶限流 → 线程池队列 → 库存校验 → 订单创建关键配置:
- 核心线程数:50(对应服务器CPU核心数)
- 最大线程数:200(突发流量缓冲)
- 队列容量:5000(配合限流阈值)
- 拒绝策略:返回"活动太火爆"提示页面

2. 金融交易系统

// 多级线程池架构
┌──────────────────────┐   ┌──────────────────────┐
│ 网络IO线程池          │ → │ 业务处理线程池         │ → │ 数据库连接池 │
│ (处理TCP连接)         │   │ (资金计算/风控)        │   └──────────────┘
└──────────────────────┘   └──────────────────────┘// 特殊要求:
- 线程本地存储(传递交易流水号)
- 严格的任务顺序保证(单线程处理同一账户)
- 亚毫秒级延迟监控

十一、性能压测数据

1. 不同队列策略对比测试

测试条件:4核CPU/8G内存,处理10万次50ms任务
┌─────────────────┬──────────┬──────────┬────────────┐
│ 队列类型         │ 耗时(秒) │ CPU使用率 │ 内存波动    │
├─────────────────┼──────────┼──────────┼────────────┤
│ SynchronousQueue │ 12.3     │ 95%      │ ±10MB      │
│ ArrayBlockingQ   │ 14.7     │ 85%      │ ±50MB      │
│ LinkedBlockingQ  │ 15.2     │ 80%      │ ±200MB     │
│ PriorityBlockingQ│ 18.9     │ 75%      │ ±150MB     │
└─────────────────┴──────────┴──────────┴────────────┘

2. 线程数优化对比

测试条件:IO密集型任务(平均耗时100ms)
┌──────────────┬──────────┬───────────────┐
│ 线程池大小     │ QPS      │ 平均延迟(ms)   │
├──────────────┼──────────┼───────────────┤
│ 4 core / 4 max│ 320      │ 125           │
│ 8 core / 8 max│ 580      │ 86            │
│ 8 core / 16 max│ 620     │ 92            │
│ 16 core / 32 max│ 640    │ 105           │
└──────────────┴──────────┴───────────────┘
结论:超过CPU核数2倍后出现收益递减

十二、安全防护策略

1. 资源隔离方案

// 关键业务独立线程池
Map<BizType, ExecutorService> pools = new EnumMap<>(BizType.class);public void submitTask(BizType type, Runnable task) {pools.computeIfAbsent(type, t -> new ThreadPoolExecutor(2, 8, 60, SECONDS, ...)).submit(task);
}

2. 防雪崩机制

// 断路器模式集成
CircuitBreaker breaker = CircuitBreaker.ofDefaults("biz");pool.submit(() -> {if (breaker.tryAcquirePermission()) {try {businessLogic();breaker.onSuccess();} catch (Exception e) {breaker.onError();throw e;}} else {fastFail(); // 快速失败降级}
});

通过以上十二个维度的系统化扩展,构建了一个从 基础原理工程实践高级优化行业落地 的完整知识体系。建议重点关注以下三个层面:

  1. 参数动态化:根据实时监控数据自动调整线程池参数
  2. 可观测性:集成Prometheus+Grafana实现线程池指标可视化
  3. 模式组合:结合熔断/限流/降级等模式构建弹性系统

最后切记:没有普适的最优配置,只有最适合业务场景的配置方案。需要建立持续的性能剖析(Profiling)和调优机制。

相关文章:

并发设计模式实战系列(4):线程池

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第四章线程池&#xff08;Thread Pool&#xff09;​&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 线程池核心组件 2. 核心…...

大模型应用案例:主动提问式的 AI 面试官(接入 DeepSeek)

目录 核心逻辑 效果演示 技术选型 大模型应用开发框架&#xff1a;langchain-deepseek UI 展示框架—streamlit 代码获取 后续改进想法 本文附带详细的视频讲解&#xff0c;欢迎小伙伴们来支持—— 【代码宇宙017】大模型&#xff1a;主动提问式的 AI 面试官&#xff0…...

算法笔记—动态规划

1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int tribonacci(int n) {if(n0) return 0;if(n1||n2) return 1;vector<int> dp(4);//初始化dp[0]0; dp[1]1; dp[2]1;for(int i3;i<n1;i){//滚动数组优化需要循环dp[i%4]dp[…...

Vue3集成Element Plus完整指南:从安装到主题定制上

一、Element Plus简介 Element Plus是一套基于Vue 3.0的桌面端组件库&#xff0c;由饿了么前端团队开源维护。它提供了丰富的UI组件&#xff0c;能够帮助开发者快速构建企业级中后台产品。 1. 安装与卸载 bash 复制 下载 # 安装最新版本 npm install element-plus -S# 卸…...

初识javascript

1. JavaScript 基础语法 (1) 变量声明 JavaScript支持三种声明变量的方式&#xff1a; var&#xff1a;传统的变量声明方式&#xff0c;存在作用域问题&#xff08;函数作用域&#xff09;。 let&#xff1a;块级作用域变量声明方式&#xff0c;避免了var的作用域问题。 co…...

C++项目 —— 基于多设计模式下的同步异步日志系统(5)(单例模式)

C项目 —— 基于多设计模式下的同步&异步日志系统&#xff08;5&#xff09;&#xff08;单例模式&#xff09; 一个问题单例模式实现1. 单例模式&#xff1a;全局唯一实例功能&#xff1a;实现细节&#xff1a;作用&#xff1a; 2. 日志器的注册与查找功能&#xff1a;实现…...

rag搭建,是如何进行向量匹配检索的?

RAG 里为什么要“向量检索”? 在 Retrieval-Augmented Generation (RAG) 中,我们的目标是让 LLM 能够“回答它本身不知道的内容”。做法是: 将知识(文本)进行向量化,存入向量数据库;用户提问后,也将问题向量化;去数据库里 找出与这个问题最相似的一批知识,返回喂给 …...

k8s 基础入门篇之开启 firewalld

前面在部署k8s时&#xff0c;都是直接关闭的防火墙。由于生产环境需要开启防火墙&#xff0c;只能放行一些特定的端口&#xff0c; 简单记录一下过程。 1. firewall 与 iptables 的关系 1.1 防火墙&#xff08;Firewall&#xff09; 定义&#xff1a; 防火墙是网络安全系统&…...

C++在VR/AR图形处理开发中的实战应用

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

Matlab 基于模型参考自适应法和SVPWM的异步电机控制

1、内容简介 Matlab 212-基于模型参考自适应法和SVPWM的异步电机控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

深入浅出讲解UDP检验中如何计算检验和

一、计算机中的进制&#xff1a;二进制与十六进制 1. 十进制&#xff08;Decimal&#xff09; 特点&#xff1a;用0-9表示&#xff0c;逢10进1。 例子&#xff1a;数字 123 表示 110221013100110221013100。 2. 二进制&#xff08;Binary&#xff09; 特点&#xff1a;用0和…...

Python类和对象一(十)

封装&#xff1a; 在创建对象之前&#xff0c;通过类将相关的属性和方法打包到一起&#xff0c;然后通过类来生成响应的对象 定义类&#xff1a; 创建对象&#xff1a; 方法里面有个参数self&#xff1a;new的对象 当我们调用类里面方法的时候&#xff0c;py是怎么知道是哪…...

jupyter切换存储路径

一、问题描述 当我采用官网提供的安装方式pip install jupyterlab&#xff0c;在Windows下的powershell里安装jupyterlab成功&#xff0c;并启动&#xff1a;jupyter lab 打开网页&#xff1a;http://localhost:8888/lab 显示如下&#xff1a;成功了&#xff0c;可是我发现这…...

PH热榜 | 2025-04-20

1. Checklist GG 标语&#xff1a;基于人工智能的清单管理工具 介绍&#xff1a;checklist.gg 是一款基于人工智能的检查清单管理工具&#xff0c;旨在帮助组织确保每次都能准确完成任务。 产品网站&#xff1a; 立即访问 Product Hunt&#xff1a; View on Product Hunt 关…...

YOLOv11改进——基于注意力机制和密集小目标增强型EVA模块的设计与实现

随着计算机视觉技术的快速发展&#xff0c;目标检测算法在实时性与检测精度间的平衡成为研究重点。YOLO&#xff08;You Only Look Once&#xff09;系列算法以其高效性和准确性&#xff0c;长期占据实时目标检测领域的前沿位置。然而&#xff0c;尽管最新版本在通用场景表现优…...

n8n 中文系列教程_04.半开放节点深度解析:Code与HTTP Request高阶用法指南

在低代码开发领域&#xff0c;n8n凭借其独特的半开放架构打破了传统自动化工具的边界。本文深度剖析两大核心节点——Code与HTTP Request&#xff0c;从底层原理到企业级实战&#xff0c;揭秘如何通过代码自由扩展与API无缝集成&#xff0c;突破平台限制。无论是对接国产生态&a…...

Linux学习——了解和熟悉Linux系统的远程终端登录

Linux学习——了解和熟悉Linux系统的远程终端登录 一.配置Ubuntu系统的网络和用户 1、设置虚拟机网络为桥接模式 打开VMWare&#xff0c;选择编辑虚拟机设置&#xff0c;在网络适配器设置中&#xff0c;选择“桥接模式”&#xff0c;保存设置并启动Ubuntu。 2、配置Ubuntu的…...

PFLM: Privacy-preserving federated learning with membership proof证明阅读

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…...

十倍开发效率 - IDEA插件之 Maven Helper

0X00 先看效果 第一个选项表示存在冲突的依赖&#xff0c;可以看到图片中 mysql 的连接依赖发生了冲突&#xff0c;在低版本的上面直接右键选择 Exclude&#xff0c;冲突的依赖就被解决掉了。 0X01 安装 在 Plugins 中直接搜索 Maven Helper&#xff0c;选择第一个进行安装&am…...

线程安全总结

1.线程安全 1.1什么是线程安全 线程安全问题指的是当多个线程同时访问和操作共享资源&#xff08;如变量、数据结构等&#xff09;时&#xff0c;由于缺乏有效的同步控制&#xff0c;导致程序出现不可预期的错误或数据不一致的现象。其核心在于并发操作破坏了程序的正确性。 …...

计算机视觉cv入门之答题卡自动批阅

前边我们已经讲解了使用cv2进行图像预处理与边缘检测等方面的知识&#xff0c;这里我们以答题卡自动批阅这一案例来实操一下。 大致思路 答题卡自动批阅的大致流程可以分为这五步&#xff1a;图像预处理-寻找考试信息区域与涂卡区域-考生信息区域OCR识别-涂卡区域填涂答案判断…...

10.QT-显示类控件|LCD Number|ProgressBar|Calendar Widget(C++)

LCD Number QLCDNumer 是⼀个专⻔⽤来显⽰数字的控件.类似于"⽼式计算器"的效果 属性说明intValueQLCDNumber 显⽰的数字值(int).valueQLCDNumber 显⽰的数字值(double).和intValue是联动的.例如给value设为1.5,intValue的值就是2.另外,设置value和intValue的⽅法名…...

深入探索 Unix 与 Linux:历史、内核及发行版

引言 在当今的计算世界中&#xff0c;Unix 和 Linux 操作系统的影响力无处不在。从驱动互联网的服务器到我们口袋里的智能手机&#xff0c;再到无数嵌入式设备&#xff0c;它们的身影随处可见 1。这两个操作系统家族共享着丰富的历史和相似的设计哲学&#xff0c;但又各自走过…...

HCIP第三次作业

一、实验要求 1&#xff0c;R5为ISP&#xff0c;其上只能配置IP地址;R4作为企业边界路由器&#xff0c; 出口公网地址需要通过PPP协议获取&#xff0c;并进行chap认证 2整个0SPF环境IP基于172.16.0.0/16划分; 3所有设备均可访问R5的环回; 4减少LSA的更新量&#xff0c;加快收敛…...

Linux 入门:基础开发工具(下)git,cgdb操作指南

目录 一.进度条 一&#xff09;.补充&#xff1a;回车与换行 二&#xff09;.行缓冲区 三&#xff09;.进度条代码 二.版本控制器Git 一&#xff09;.Git 安装与配置 二&#xff09;.创建仓库 三&#xff09;.开始操作 1.简单流程 2.配置公钥 1&#xff09;.身份…...

【上位机——MFC】消息映射机制

消息映射机制 Window消息分类消息映射机制的使用代码示例 MFC框架利用消息映射机制把消息、命令与它们的处理函数映射起来。具体实现方法是在每个能接收和处理消息的类中&#xff0c;定义一个消息和消息函数指针对照表&#xff0c;即消息映射表。 在不重写WindowProc虚函数的大…...

提交bug单时,应该说明哪些信息?

在提交 Bug 单时&#xff0c;为了让开发人员能够快速定位和解决问题&#xff0c;需要详细说明以下几方面信息&#xff1a; Bug 的基本信息 标题&#xff1a;简洁明了地概括 Bug 的主要问题&#xff0c;例如 “登录页面输入错误密码后提示信息不准确”。Bug 类型&#xff1a;明确…...

max31865典型电路

PT100读取有很多种方案&#xff0c;常用的惠斯通电桥&#xff0c;和专用IC max31865 。 电阻温度检测器(RTD)是一种阻值随温度变化的电阻。铂是最常见、精度最高的测温金属丝材料。铂RTD称为PT-RTD&#xff0c;镍、铜和其它金属亦可用来制造RTD。RTD具有较宽的测温范围&#x…...

【网工第6版】第4章 无线通信网

目录 ■ 移动通信与4G 5G技术 ▲ 移动通信发展 ▲ 移动通信制式 ▲ 移动通信技术标准 ▲ 4G标准 ▲ 4G关键技术 ◎ OFDMA ◎ 4G关键技术-MIMO ◎ 4G关键技术-SDR ◎ 4G关键技术-VolP ▲ 5G应用场景 ▲ 5G两种组网模式 ▲ 5G关键技术 ■ CDMA计算 ■ WLAN通信技术…...

辅助函数构造题目(缓慢更新,遇到更道)

题1...

图论基础:图存+记忆化搜索

图的储存 储存图有很多种方式&#xff0c;在此介绍两种&#xff1a;邻接数组&#xff0c;邻接表 第一种虽然简单&#xff0c;但访问的时间和空间花销过大&#xff0c;因此第二种最为常见。 让我们分别看看它们是什么 在介绍之前&#xff0c;我们先解释一下此处说的“图”是什…...

使用docker任意系统编译opengauss

使用docker任意系统编译opengauss 本人使用开发机器为ubuntu系统&#xff0c;不在官方推荐的编译系统内。但是不想为了开发opengauss重装系统。所以采用docker进行编译。 代码拉取 本人是在/home/yuyang/Documents/opengauss目录下进行操作。 先获取源代码:git clone https:/…...

JavaScript 一维数组转二维数组

题目描述&#xff1a; <script>const num [1,2,3,4]const out (function(num,m,n){if(num.length ! m*n){return []}const newarr []for(let i 0;i<m;i){newarr.push(num.slice(i*n,(i1)*n))}return newarr})(num,2,2)console.log(out)</script>不使用Stri…...

C#进阶学习(八)常见的泛型数据结构类(3)SortedDictionary<TKey, TValue>与SortedList<TKey, TValue>

目录 关于默认的排序可以看这篇文章的第二点中关于排序的部分&#xff1a; 一、SortedDictionary 1. 核心特性 2. 常用方法和属性 二、SortedList 1. 核心特性 2. 常用方法和属性 三、关于TryGetValue(TKey key, out TValue value) 方法的详细说明 &#xff08;一&…...

运维侠职场日记9:用DeepSeek三天通关详解自动化操作pdf批量提取PDF文字将PDF转Word文档(附上脚本代码)

一. 痛点 运维侠小白想将pdf文档转换成word文档,但是,wps等等这些软件的转换功能都是要付费,开通会员,这该怎么办?听说python也有这个功能于是迫不及待想学… 学会基础,学习的乐趣一点点积累 基础学习成本低,掌握所需的技能要求也少,学会一两行代码,看着输出,心理慢…...

热门算法面试题第19天|Leetcode39. 组合总和40.组合总和II131.分割回文串

39. 组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&#xff08;包括 ta…...

IDEA连接达梦数据库

1. 参考在IDEA中连接达梦数据库&#xff1a;详细配置指南_idea连接达梦数据库-CSDN博客 . jdbc:dm://127.0.0.1:5236?schemaSALES...

React Router V7使用详解

1,安装 React Router是React生态系统中最流行的路由解决方案,它允许开发者在单页应用的不同页面之间进行切换,而不需要重新加载整个页面,React Router与React框架深度集成,使得开发者在单页面应用中进行页面切换时变得轻而易举。 作为官方推荐的路由解决方案,React Rou…...

国际数据加密算法(IDEA)详解

以下是修正后的准确版本,已解决原文中的术语、符号及技术细节问题: ​国际数据加密算法(IDEA)​ IDEA是一种分组加密算法,由Xuejia Lai(来学嘉)和James Massey于1990年设计。IDEA使用128位密钥对64位明文分组进行加密,经过8轮迭代运算后生成64位密文分组。其安全性基于…...

2025年4月19日-米哈游春招笔试题-第三题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 魔法网格变换术 问题描述 在魔法学院,卢小姐正在研究一种特殊的魔法网格变换术。这种魔法作用于一个 n n n...

基于STM32串口通信

基于STM32串口通信 一、串口简介 串口&#xff0c;也称为串行接口或串行通信接口&#xff08;通常指COM接口&#xff09;&#xff0c;是一种采用串行通信方式的扩展接口。它实现了数据一位一位地顺序传送&#xff0c;具有通信线路简单、成本低但传送速度慢的特点。 只要一对传…...

即梦AI与可灵AI视频生成功能对比分分析

一、核心功能与特点对比 维度可灵AI&#xff08;快手旗下&#xff09;即梦AI&#xff08;字节跳动旗下&#xff09;视频生成能力✅ 支持最长3分钟视频生成&#xff08;通过续写功能&#xff09;✅ 1080p分辨率、30fps帧率✅ 物理模拟&#xff08;流体运动、重力效果&#xff0…...

【任务调度】Quartz入门

Quartz 入门 代码仓库地址&#xff1a; GitHub&#xff1a;chenmeng-test-demos/demo8-task at master cmty256/chenmeng-test-demosGitee&#xff1a;demo8-task chenmeng/chenmeng-test-demos - 码云 - 开源中国 基本介绍 Quartz 是一个开源的作业调度框架&#xff0c;它完…...

【网络编程】从零开始彻底了解网络编程(二)

本篇博客给大家带来的是网络编程的知识点,. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心要快乐顺便进步 1. …...

常见浏览器 WebDriver 驱动下载

以下是常见浏览器 WebDriver 驱动的下载地址及注意事项&#xff0c;综合多个可靠来源整理而成&#xff1a; 一、Chrome 浏览器&#xff08;ChromeDriver&#xff09; 官方下载地址 http://chromedriver.storage.googleapis.com/index.html • • 版本匹配&#xff1a;需与 Chro…...

【每日八股】复习计算机网络 Day3:TCP 协议的其他相关问题

文章目录 昨日内容复习TCP 的四次挥手&#xff1f;TCP 为什么要四次挥手&#xff1f;在客户端处于 FIN_WAIT_2 状态时&#xff0c;如果此时收到了乱序的来自服务端的 FIN 报文&#xff0c;客户端会如何处理&#xff1f;何时进入 TIME_WAIT 状态&#xff1f;TCP 四次挥手丢了怎么…...

大模型在胆管结石(无胆管炎或胆囊炎)预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、胆管结石相关理论基础 2.1 胆管结石概述 2.2 临床表现与诊断方法 2.3 传统治疗方法 三、大模型技术原理与应用优势 3.1 大模型基本原理 3.2 在医疗领域的应用潜力 3.3 用于胆管结石预测的可…...

LeetCode第159题_至多包含两个不同字符的最长子串

LeetCode 第159题&#xff1a;至多包含两个不同字符的最长子串 题目描述 给定一个字符串 s&#xff0c;找出 至多 包含两个不同字符的最长子串 t&#xff0c;并返回该子串的长度。 难度 中等 题目链接 点击在LeetCode中查看题目 示例 示例 1&#xff1a; 输入: s &qu…...

PG CTE 递归 SQL 翻译为 达梦版本

文章目录 PG SQLDM SQL总结 PG SQL with recursive result as (select res_id,phy_res_code,res_name from tbl_res where parent_res_id (select res_id from tbl_res where phy_res_code org96000#20211203155858) and res_type_id 1 union all select t1.res_id, t1.p…...

JavaScript 位掩码常量教程

JavaScript 位掩码常量教程 位掩码&#xff08;Bitmask&#xff09;是一种高效使用内存的技术&#xff0c;在JavaScript中可以用来存储和操作多个布尔值标志。下面我将为您介绍位掩码的基本概念、应用场景以及实践示例。 什么是位掩码常量&#xff1f; 位掩码利用二进制位&a…...