【深入理解Java线程池】
深入理解Java线程池
Java线程池是Java并发编程中的一个重要概念,它提供了一种管理和复用线程的机制,可以显著减少创建和销毁线程的开销,提高系统的响应速度和吞吐量。以下是对Java线程池的详细解析:
一、线程池的基本概念
线程池是一个由多个线程组成的集合,这些线程可以被动态地分配给不同的任务。线程池中的线程在执行完一个任务后,并不会被销毁,而是会回到线程池中等待执行下一个任务。这样可以避免频繁地创建和销毁线程,提高系统的性能。
二、线程池的核心参数
- corePoolSize(核心线程数):线程池中始终保持的线程数量,即使这些线程处于空闲状态。
- maximumPoolSize(最大线程数):线程池能够容纳的最大线程数。当工作队列满时,线程池会尝试创建新的线程,直到线程数量达到
maximumPoolSize
。 - keepAliveTime(线程空闲时间):当线程数量超过
corePoolSize
时,这是多余空闲线程在终止前等待新任务的最长时间。 - unit(时间单位):用于指定
keepAliveTime
的时间单位。 - workQueue(任务队列):用于保存等待执行的任务的阻塞队列。
- threadFactory(线程工厂):用于创建新线程的工厂。通过线程工厂可以给每个创建出来的线程设置更有意义的名字。
- handler(拒绝策略):当队列和线程池都满了,说明线程池处于饱和状态,必须采取一种策略处理提交的新任务。这个策略默认情况下是
AbortPolicy
,表示无法处理新任务时抛出异常。还可以选择CallerRunsPolicy
(用调用者所在线程来运行任务)、DiscardPolicy
(丢弃队列里最近的一个任务,并执行当前任务)、DiscardOldestPolicy
(丢弃最老的任务,尝试重新提交新的任务)等策略,或者根据应用场景实现RejectedExecutionHandler
接口自定义策略。
三、线程池的工作流程
- 提交任务:任务通过
execute(Runnable command)
或submit(Callable<T> task)
方法提交到线程池。 - 判断核心线程是否空闲:如果线程池中的核心线程数量少于
corePoolSize
,则创建新的核心线程来执行任务。 - 放入任务队列:如果核心线程都在忙,则任务会被放入
workQueue
中等待执行。 - 创建非核心线程:如果
workQueue
已满,且当前线程数量少于maximumPoolSize
,则线程池会尝试创建新的非核心线程来执行任务。 - 拒绝任务:如果
workQueue
已满,且线程数量已达到maximumPoolSize
,则线程池会根据拒绝策略拒绝新任务。 - 线程回收:当线程数量超过
corePoolSize
,且空闲线程的空闲时间超过keepAliveTime
,则这些线程会被回收。
四、常见的线程池类型
- FixedThreadPool(固定大小线程池):包含固定数量的线程,适用于需要限制并发线程数量的场景。
- CachedThreadPool(缓存线程池):不固定线程数量,可以根据需要自动创建新线程,适用于执行大量短期异步任务。
- SingleThreadPool(单线程池):只包含一个工作线程,保证所有任务按顺序执行,适用于需要保持任务顺序执行的场景。
- ScheduledThreadPool(定时线程池):可以执行定时任务和周期性任务。
- WorkStealingPool(工作窃取线程池):Java 8中引入的一种新类型的线程池,主要用于处理耗时任务,适用于需要大量并行任务、任务之间没有依赖关系的情况。
五、线程池的使用方法和注意事项
- 创建线程池:可以使用
ThreadPoolExecutor
类来创建线程池,并设置相应的参数。也可以使用Executors
工厂类来方便地创建常见的线程池类型。 - 提交任务:通过
execute()
或submit()
方法将任务提交到线程池。 - 关闭线程池:线程池应该通过
shutdown()
或shutdownNow()
方法显式关闭。shutdown()
方法会平滑地关闭线程池,不再接受新任务,但会继续执行队列中的任务。shutdownNow()
方法会尝试立即关闭线程池,并尝试停止正在执行的任务。 - 注意事项:
- 避免创建过多的线程,合理配置线程池的大小。
- 任务执行时间不宜过长,以免影响线程池的响应速度。
- 确保提交给线程池的任务是线程安全的。
- 根据应用需求合理设置线程池的参数。
六、示例代码
使用ThreadPoolExecutor
创建线程池并提交任务的示例代码:
import java.util.concurrent.*;public class ThreadPoolExample {public static void main(String[] args) {// 创建线程池ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // 核心线程数4, // 最大线程数60L, TimeUnit.SECONDS, // 线程空闲时间和时间单位new LinkedBlockingQueue<Runnable>());// 向线程池提交任务for (int i = 0; i < 10; i++) {final int task = i;executor.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " 正在执行第 " + (task + 1) + " 个任务");}});}// 关闭线程池executor.shutdown();}
}
使用Executors
工厂类创建不同类型线程池
import java.util.concurrent.*;public class ExecutorsExample {public static void main(String[] args) throws InterruptedException {// 创建一个固定大小的线程池ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);// 创建一个缓存线程池ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 创建一个单线程线程池ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();// 创建一个定时线程池ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);// 创建一个工作窃取线程池ExecutorService workStealingPool = Executors.newWorkStealingPool();// 提交任务给不同类型的线程池for (int i = 0; i < 5; i++) {final int taskIndex = i;fixedThreadPool.submit(() -> printTaskInfo("Fixed", taskIndex));cachedThreadPool.submit(() -> printTaskInfo("Cached", taskIndex));singleThreadPool.submit(() -> printTaskInfo("Single", taskIndex));scheduledThreadPool.schedule(() -> printTaskInfo("Scheduled", taskIndex), 2, TimeUnit.SECONDS); // 延迟2秒执行}// 关闭所有线程池fixedThreadPool.shutdown();cachedThreadPool.shutdown();singleThreadPool.shutdown();scheduledThreadPool.shutdown();workStealingPool.shutdown();}private static void printTaskInfo(String poolType, int taskIndex) {System.out.println(poolType + " Thread Pool: " + Thread.currentThread().getName() + " is executing Task-" + taskIndex);}
}
使用自定义线程工厂和拒绝策略
import java.util.concurrent.*;public class CustomThreadPoolExample {public static void main(String[] args) {// 定义自定义线程工厂ThreadFactory namedThreadFactory = new ThreadFactory() {private int count = 0;@Overridepublic Thread newThread(Runnable r) {return new Thread(r, "MyCustomThread-" + count++);}};// 定义自定义拒绝策略RejectedExecutionHandler customRejectedHandler = new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {System.err.println("Task " + r.toString() + " rejected from " + executor.toString());}};// 创建带有自定义线程工厂和拒绝策略的线程池ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 60L, TimeUnit.SECONDS,new LinkedBlockingQueue<>(10),namedThreadFactory,customRejectedHandler);// 提交大量任务测试自定义拒绝策略for (int i = 0; i < 20; i++) {final int taskNumber = i;executor.execute(() -> printTaskInfo("Custom", taskNumber));}// 关闭线程池executor.shutdown();}private static void printTaskInfo(String poolType, int taskIndex) {System.out.println(poolType + " Thread Pool: " + Thread.currentThread().getName() + " is executing Task-" + taskIndex);}
}
使用submit()
方法提交可返回结果的任务
import java.util.concurrent.*;public class CallableExample {public static void main(String[] args) throws InterruptedException, ExecutionException {// 创建线程池ExecutorService executor = Executors.newSingleThreadExecutor();// 提交Callable任务,该任务可以返回结果Future<Integer> future = executor.submit(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {// 模拟耗时操作TimeUnit.SECONDS.sleep(2);return 123;}});// 获取任务的结果try {Integer result = future.get(); // 阻塞直到任务完成System.out.println("Task returned: " + result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();} finally {// 关闭线程池executor.shutdown();}}
}
使用invokeAll()
方法提交多个任务并获取结果
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;public class InvokeAllExample {public static void main(String[] args) throws InterruptedException, ExecutionException {// 创建线程池ExecutorService executor = Executors.newFixedThreadPool(3);// 创建多个Callable任务List<Callable<String>> tasks = new ArrayList<>();for (int i = 0; i < 5; i++) {final int taskId = i;tasks.add(() -> {// 模拟耗时操作TimeUnit.SECONDS.sleep(1);return "Result of Task-" + taskId;});}// 提交所有任务并等待所有任务完成List<Future<String>> futures = executor.invokeAll(tasks);// 获取所有任务的结果for (Future<String> future : futures) {System.out.println(future.get()); // 阻塞直到每个任务完成}// 关闭线程池executor.shutdown();}
}
以上就是对Java线程池的详细解析,包括线程池的基本概念、核心参数、工作流程、常见类型、使用方法和注意事项等内容。通过深入理解线程池,我们可以更好地利用线程池来提高并发应用的性能和可靠性。
相关文章:
【深入理解Java线程池】
深入理解Java线程池 Java线程池是Java并发编程中的一个重要概念,它提供了一种管理和复用线程的机制,可以显著减少创建和销毁线程的开销,提高系统的响应速度和吞吐量。以下是对Java线程池的详细解析: 一、线程池的基本概念 线程…...
honle电源控制器维修UV灯高压电源EVG EPS200
UV电源控制器维修;honle电源维修;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号: EPS 60/120、EPS 100、EPS200、EPS 220、EPS 340、LED Spot 100、UV2000F HONLE UV灯高压电源控制器故障包括: 1、电压不稳&#…...
java中List集合小练习
题目:将1~100之间所有正整数存放在一个List集合中,并将集合索引位置时10的对象从集合中移除。 代码: import java.util.ArrayList; import java.util.List;public class ListTest {public ListTest(){List<Integer> listnew ArrayLis…...
【STM32练习】基于STM32的PM2.5环境监测系统
一.项目背景 最近为了完成老师交付的任务,遂重制了一下小项目用STM32做一个小型的环境监测系统。 项目整体示意框图如下: 二.器件选择 单片机(STM32F103)数字温湿度模块(DHT11)液晶显示模块(0.8…...
JS哪些操作会造成内存泄露?
在 JavaScript 中,内存泄露是指程序不再使用的内存没有被释放,从而导致内存的持续增长,最终可能导致性能下降或应用崩溃。以下是一些常见的可能导致内存泄露的操作和情况: 1. 全局变量 如果不小心创建了全局变量,可能…...
《知识拓展 · 统一建模语言UML》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
GNSS 全球卫星导航系统(Global Navigation Satellite System): 卫星授时
文章目录 引言I GNSSGNSS三大核心能力卫星系统、区域性的系统以及增强系统II 卫星授时GNSS是如何实现授时优势引言 GNSS指的是全球卫星导航系统,是能在全球范围内提供导航服务的卫星导航系统的通称。 美国GPS、俄罗斯GLONASS、中国北斗卫星导航系统和欧洲GALILEO,是联合国全…...
【数据结构】循环队列原理与代码
理论 存在的意义: 将顺序队列从逻辑上视为一个环。解决“假溢出”(出队入队连续操作后两个指针均到数组末端maxsize-1处,虽然队里没有元素但无法让元素进队)。两种定义 1.题目是队列非空时队头指针和队尾指针分别指向队头元素和队…...
Kettle Doris Plugin编译过程
起因 公司的数据中台产品用的doris作为数据仓库,用kettle作为etl引擎,但是表输出组件太慢了。偶然有一天发现doris提供了kettle组件,但是需要自己编译,于是就开始自己编译。 坑 因为kettle的依赖包在m2(中央仓库&am…...
Day10 苍穹外卖项目 订单搜索、各个状态的订单统计、查询订单详细、接单、拒单、取消订单、派送订单、完成订单
目录 1.订单搜索 1.1 需求分析和设计 1.2 接口设计 1.2 代码实现 1.2.1 admin/OrderController 1.2.2 OrderService 1.2.3 OrderServiceImpl 2.各个状态的订单数量统计 2.1 需求分析和设计 2.2 接口设计 2.3 代码实现 2.3.1 admin/OrderController 2.3.2 OrderService 2.3.3 Or…...
你知道OSI参考模型是什么吗?
你知道OSI参考模型是什么吗? 一. OSI模型图解二. OSI七层模型三. OSI模型的特点四. OSI模型与TCP/IP模型的对比五. 总结 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱…...
《开源数据:开启信息共享与创新的宝藏之门》
《开源数据:开启信息共享与创新的宝藏之门》 一、开源数据概述(一)开源数据的定义(二)开源数据的发展历程 二、开源数据的优势(一)成本效益优势(二)灵活性与可定制性&…...
机器学习之学习范式
机器学习的四种主要范式分别是:监督学习、非监督学习、强化学习和半监督学习。以下是每种范式的详细介绍: 1. 监督学习(Supervised Learning) 定义: 通过已标注的数据训练模型,以预测或分类未知数据。 目…...
计算机网络技术基础:5.数据通信系统
一、数据通信的基本概念 1.信息 信息是对客观事物的运动状态和存在形式的反映,可以是客观事实的形态、大小、结构、性能等描述,也可以是客观事物与外部之间的联系。信息的载体可以是数字、文字、语音、图形和图像等。计算机及其外围设备产生和交换的信息…...
ubuntu下anconda装pytorch
1、禁用nouveau sudo vim /etc/modprobe.d/blacklist.conf 在文件最后部分插入以下两行内容 blacklist nouveau options nouveau modeset0 更新系统 sudo update-initramfs -u 重启系统 2、装nvidia驱动 卸载原来驱动 sudo apt-get remove nvidia-* (若安装…...
【深入理解MySQL索引】
深入理解MySQL索引 MySQL索引是一种数据结构,用于帮助快速查找和检索数据库表中的数据。以下是对MySQL索引的详细解释,并附有相应的代码示例以加深理解。 一、索引的原理及作用 原理:索引是以数据库表中的“列”为维度建立的,通…...
Linux 中批量添加cron定时任务的方法
目录 方法一:通过 crontab 命令批量添加方法二:通过直接修改 crontab 文件 方法一:通过 crontab 命令批量添加 1、先将需要添加 cron 执行的多条定时任务写入一个文本文件 例如: 0 3 * * * /bin/bash /root/work/job/MySQLBack.…...
【OSS】php使用oss存储
阿里云oss官方文档:文档 1、前期工作 创建阿里云账号,登录创建bucket,注意修改权限,要不然可能读取不到 申请accessKeyId和accessKeySecret accessKey 2、项目中安装OSS扩展 composer require aliyuncs/oss-sdk-php3、基础使…...
个人ffmpeg笔记(一)
环境安装 QT环境安装 运行qt…run安装 下载地址:https://download.qt.io/archive/qt/ 下载地址:https://download.qt.io/archive/qt/5.12/5.12.10/ sudo apt install --reinstall libxcb-xinerama0 解决xcb问题 Ubuntu16.04打开Qt显示/home/user/.co…...
Python的3D可视化库【vedo】2-3 (plotter模块) 增删物体、控制相机
文章目录 4 Plotter类的方法4.3 渲染器内的物体操作4.3.1 添加物体4.3.2 移除物体4.3.3 渲染器的内容列表 4.4 相机控制4.4.1 访问相机对象4.4.2 重置相机状态4.4.3 移动相机位置4.4.4 改变相机焦点4.4.5 改变相机朝向的平面4.4.5 旋转相机4.4.6 对齐相机的上朝向4.4.7 缩放 ve…...
关于QMessageBox的一些使用总结和避坑指南
参考学习 Qt中QMessageBox的用法—看这一篇就够了 Qt:使用QMessageBox弹出标准对话框 QMessageBox模态与非模态及QT中的exec() 如何调整QMessageBox的大小 QSS 自定义QMessageBox python QMessageBox设置标签和按钮居中、中文按钮 使用建议 经过查看多方的资料&…...
LearnOpenGL学习(高级OpenGL -> 高级GLSL,几何着色器,实例化)
高级GLSL 内建变量 顶点着色器 gl_PointSoze : float 输出变量,用于控制渲染 GL_POINTS 型图元时,点的大小。可用于粒子系统。将其设置为 gl_Position.z 时,可以使点的距离越远,大小越大。创建出类似近视眼看远处灯光的效果 gl…...
for X_batch, y_batch in dataloader ,其中y_batch想转成list
for X_batch, y_batch in dataloader ,其中y_batch想转成list for X_batch, y_batch in dataloader:# y_batch数据类型的是 tensor组成的list# 初始化一个空列表来存储展平后的数据y_batch_flat []# 遍历y_batch 这个list中的每个张量for tensor in y_batch:# 展平…...
Kruskal最小生成树算法正确性证明
Kruskal: 每次考虑最短一条边, 如果会形成回路则不选择该边, 如果不会形成回路则选择该边, 直到选出了n-1条边 要点: 每次都选择不会形成回路的最短边 数学归纳法 ① n<2时, 显然成立 ② 设n k时成立, 则当n k1时: 将图划分为 子图A(k) 和 B(1) ∵ n k时成立 ∴ A(k)可…...
操作系统(12)内存分配
前言 操作系统内存分配是操作系统内存管理的重要组成部分,涉及将物理内存分配给各个程序以使用的过程。 一、内存分配的基本概念 内存分配指的是操作系统将物理内存分配给程序以使用。操作系统通过内存分配,确保每个程序都能获得足够的内存资源来执行其任…...
oracle client linux服务器安装教程
p13390677_112040_Linux-x86-64_4of7.zip 安装前,确认/etc/hosts文件已配置正确 cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.2…...
生信技能65 - SRA数据库公共数据自动化下载及SRA批量自动化拆分
根据NCBI Metadata数据表,实现SRA数据库公共数据自动化下载及SRA批量自动化拆分。 1. 程序逻辑 根据SraRunTable.csv自动从公共数据库下载SRA文件 ;模式0(默认)为下载模式,模式1为拆分模式,拆分支持进度显示;提取Metadata关键信息数据,重新写入新的文本文件。2. 运行示…...
ubuntu+ros新手笔记(五):初探anaconda+cuda+pytorch
深度学习三件套:初探anacondacudapytorch 系统ubuntu22.04 ros2 humble 1.初探anaconda 1.1 安装 安装过程参照【详细】Ubuntu 下安装 Anaconda 1.2 创建和删除环境 创建新环境 conda create -n your_env_name pythonx.x比如我创建了一个名为“py312“的环境…...
下载红米Note 9 Pro5G对应的LineageOS代码下载及编译
构建 LineageOS 进入网站:Info about gauguin | LineageOS Wiki,点击:Build for yourself,里面有详细的教程,我这里就按照Note 9 Pro 5G来。 机器环境 Ubuntu环境为:20.04.6LinagesOS版本:21-…...
数据链路层(Java)(MAC与IP的区别)
以太网协议: "以太⽹" 不是⼀种具体的⽹络, ⽽是⼀种技术标准; 既包含了数据链路层的内容, 也包含了⼀些物理 层的内容. 例如: 规定了⽹络拓扑结构, 访问控制⽅式, 传输速率等; 例如以太⽹中的⽹线必须使⽤双绞线; 传输速率有10M, 100M, 1000M等; 以太…...
Unity中Mesh重叠顶点合并参考及其应用
在Unity中,如果将一个模型文件(比如从max里面导出一个fbx文件)导入到编辑器中之后,Unity会把所有在原来在面列表中公用的顶点复制一份,保证每个三角形使用的顶点都是单独的,不与其它三角形共用顶点…...
Day3——墨刀原型设计
墨刀介绍 墨刀(Mockplus)是一款流行的在线原型设计和协作工具,适用于网页和移动应用的设计。以下是墨刀的一些主要特点和功能: 主要特点: 快速原型设计:墨刀提供了一系列的设计工具和组件,可…...
【JAVA】Java项目实战—移动端项目:天气查询APP
在移动互联网时代,天气查询应用程序(APP)是日常生活中不可或缺的一部分。无论是出门旅行、上班通勤,还是安排户外活动,获取实时天气信息都至关重要。Java作为一种强大且广泛使用的编程语言,特别适合用于开发…...
P1208 [USACO1.3] 混合牛奶 Mixing Milk(py)
题目描述 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助 Marry 乳业找到最优的牛奶采购方案。 Marry 乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格可能相同。此外,…...
day13 python(1)——python基础
【没有所谓的运气🍬,只有绝对的努力✊】 1、python简介 1.1 为什么学习python 1.2 python发展历史 python2.x和python3.x 版本里面有些是不兼容的。(我自己本地版本 3.11) 2、语言的分类 (1)编译型 …...
Tomcat原理(5)——tomcat最终实现
目录 一、什么是Servlet容器 二、ServletConfigMapping构建实现容器 ServletConfigMapping MyTomcat 三、优化server Server MyTomcat 四、匹配 代码如下: 测试如下: 上一篇博客已经为介绍了servelet的实现 ,这篇对上一篇博客进行补…...
善战者与细
《孙子兵法》说:善战者无赫赫战功。 《道德经》说:天下大事必做于细。 这两句话,可以结合来思考。如果,我们把事业,拆解为多个小项目,小项目拆解为小行动,也就是天下大事作于细。这种情况下&am…...
sqli-labs靶场第26-30关
第26关 这关将逻辑运算符,注释符以及空格给过滤了 我们先使用单引号进行闭合 这时我们查看源代码可以看到这一关过滤了很多字符 可以看到这里将or and / -- # 空格等字符都被注释了 空格被过滤了我们可以使用()来代替,and和or可以使用双写来绕过 因为…...
ffmpeg和ffplay命令行实战手册
文章目录 视频拼接用concat视频分段拼接(ffplay 不可调用seek函数进行seek)给视频添加黑边,让视频填充并居中显示不同分辨率视频分段拼接,并且,设置单个视频的缩放比例和摆放位置视频画中画复杂嵌套用overlay(ffplay 可调用seek函数进行seek)…...
240004】基于maven的java+ssm+mysql的房屋租赁系统的设计与实现
基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化,包括新增了注册功能,房屋模糊查询功能,管理员和用户信息管理等功能,以及对网站界面进行了优…...
2.metagpt中的软件公司智能体 (ProductManager 角色)
1. 代码 ProductManager 类 from metagpt.actions import UserRequirement, WritePRD from metagpt.actions.prepare_documents import PrepareDocuments from metagpt.roles.role import Role, RoleReactMode from metagpt.utils.common import any_to_nameclass ProductMan…...
MOS管振铃现象
1,什么是振铃 用MOS管作为电子开关电路如下 单片机输出的PWM波形应该是规整的方波信号。但实际上确出现了下图的不稳定波形。这种上升沿和下降沿出现的不同程度的一小段震荡就叫做MOS管的振铃。如果振铃的峰值超过G端耐压,GS之间就会被击穿,…...
docker简单命令
docker images 查看镜像文件 docker ps -a 查看容器文件 docker rm 0b2 删除容器文件,id取前三位即可 docker rmi e64 删除镜像文件(先删容器才能删镜像),id取前三位即可 在包含Dockerfile文件的目录…...
XML基础学习
参考文章链接: XML基础学习 在w3school看到了XML的教程,想到以前工作学习中也接触到了XML,但只是简单搜索了解了下,没有认真去学习XML的基础,所以现在认真看下其基础部分,并写篇博客作为笔记记录下。 XML 简介 XML 被设计用来传输和存储数据。 什么是 XML? XML 指可…...
ARMS 用户体验监控正式发布原生鸿蒙应用 SDK
作者:杨兰馨(楠瑆) 背景 2024 年 10 月 22 日,华为正式发布了原生鸿蒙操作系统(HarmonyOS NEXT)。原生鸿蒙实现了系统底座全部自研,系统的流畅度、性能、安全特性等方面显著提升,也…...
如何使用微调后的Lora适配器?
Lora(Low-Rank Adaptation) 是一种高效的模型微调方法,尤其在自然语言处理和生成任务中得到了广泛应用。与传统的微调方法相比,Lora方法通过低秩适配器的方式,使得模型微调更为高效,且资源消耗更少。本文将…...
HAL 库:创建hal首要配置内容
第一步配置SYS(system系统) Debug(调试): Serial Wire 串行线(要用stick) Timebase Source:时基源 第二步配置RCC(reset and clodk controler)复位和时钟控…...
YOLOv9-0.1部分代码阅读笔记-experimental.py
experimental.py models\experimental.py 目录 experimental.py 1.所需的库和模块 2.class Sum(nn.Module): 3.class MixConv2d(nn.Module): 4.class Ensemble(nn.ModuleList): 5.def attempt_load(weights, deviceNone, inplaceTrue, fuseTrue): 1.所需的库和模块…...
如何高效获取Twitter数据:Apify平台上的推特数据采集解决方案
引言 在数据分析和市场研究领域,Twitter(现在的X)数据一直是重要的信息来源。但是,自从Twitter更改API定价策略后,获取数据的成本大幅提升。本文将介绍一个经济实惠的替代方案。 为什么需要Twitter数据? …...
【蓝凌表单】JSP组件常用语法整理
JSP组件常用语法整理 必填非必填写法//必填 $("[name=extendDataFormInfo.value(fd_344677482769e2)]").attr("validate","requiredvalue"); //非必填 $(...