C# 线程--Thread类
目录
什么是线程?
Thread类的定义
创建和启动线程
使用 ThreadStart 委托
使用 ParameterizedThreadStart 委托
Lambda简写
使用线程池(ThreadPool)
使用线程池的优点
使用 ThreadPool 的一般步骤
常用方法
Start()
Join()
Sleep(int millisecondsTimeout)
Abort()
IsAlive
ManagedThreadId
SetApartmentState(ApartmentState)
Interrupt()
在C#中,线程(Thread)是执行代码的基本单位。一个程序可以包含多个线程,这些线程可以并行执行,从而提高效率和响应能力。
什么是线程?
线程是操作系统中执行代码的最小单位,它是进程(Process)内的一个独立执行流。每个线程都有自己的调用堆栈和程序计数器,但与同一进程内的其他线程共享内存和资源。使用线程可以实现多任务处理,提高程序的响应速度。
Thread类的定义
Thread
类位于 System.Threading
命名空间中。每个 Thread
对象表示一个线程,可以通过该对象启动、停止和管理线程的执行。
创建和启动线程
创建线程的一般步骤如下:
- 创建Thread对象:指定线程要执行的方法。
- 启动线程:调用
Start()
方法。 - 可选:等待线程结束:使用
Join()
方法。
需要创建一个线程。可以通过传递一个ThreadStart
或ParameterizedThreadStart
委托来指定线程要执行的方法。
使用 ThreadStart
委托
这是最常见的方式之一,适用于没有参数的方法。
using System;
using System.Threading;class Program
{static void Main(){Thread thread = new Thread(PrintNumbers);thread.Start(); // 启动线程thread.Join(); // 等待线程完成}static void PrintNumbers(){for (int i = 0; i < 10; i++){Console.WriteLine(i);Thread.Sleep(100);}}
}
使用 ParameterizedThreadStart
委托
如果你需要向线程传递参数,可以使用 ParameterizedThreadStart
委托:
Thread thread = new Thread(new ParameterizedThreadStart(ProcessData));
thread.Start(42); // 传递参数static void ProcessData(object data)
{Console.WriteLine($"处理数据: {data}");
}
Lambda简写
以上是原理方法,平时我们可以直接用Lambda表达式来简写
推荐直接使用第三种,不用考虑那么多
// 创建线程,不传递参数----简写ThreadStart 委托Thread thread = new Thread(() => PrintNumbers());thread.Start(); // 启动线程thread.Join(); // 等待线程完成// 创建一个线程,传递参数----简写ParameterizedThreadStart 委托Thread thread = new Thread(param => Compute((int)param));thread.Start(42); // 启动线程并传递参数42thread.Join(); // 等待线程完成//直接用的匿名方法,方法内去调用compute,也相当于ThreadStart委托
Thread thread = new Thread(() => Compute(42)); // 直接传递参数42
thread.Start(); // 启动线程
thread.Join(); // 等待线程完成
使用线程池(ThreadPool)
线程池是一个可以重用的线程集合,允许程序在需要时获取线程,而不必每次都创建和销毁线程。这样可以提高性能与资源利用率,特别是在需要频繁启动和结束线程的场景中。
使用线程池的优点
- 性能提升:由于线程可以被重用,减少了线程创建和销毁的开销。
- 资源管理:线程池自动管理线程的数量,系统会根据需求动态调整线程池中的线程数量,以避免线程过多导致系统负担过重。
- 简化代码:通过线程池,可以避免手动管理线程的生命周期。
使用 ThreadPool
的一般步骤
- 使用
QueueUserWorkItem
方法提交工作项:将要执行的任务定义为一个方法(通常是一个Action
)。 - 单独的工作线程将从线程池中获取该任务并执行:无需直接管理线程。
using System;
using System.Threading;class Program
{static void Main(){Console.WriteLine("启动多个线程...");// 启动 5 个线程for (int i = 0; i < 5; i++){int threadId = i; // 捕获循环变量ThreadPool.QueueUserWorkItem(DoWork, threadId);}// 等待用户输入以保持主线程运行Console.WriteLine("按任意键退出...");Console.ReadKey();}static void DoWork(object state){int id = (int)state;Console.WriteLine($"线程 {id} 开始工作...");// 模拟工作负载for (int i = 0; i < 5; i++){Console.WriteLine($"线程 {id} 正在处理任务 {i + 1}...");Thread.Sleep(new Random().Next(500, 1000)); // 随机休眠 500 到 1000 毫秒}Console.WriteLine($"线程 {id} 完成工作.");}
}
启动多个线程...
按任意键退出...
线程 0 开始工作...
线程 1 开始工作...
线程 2 开始工作...
线程 3 开始工作...
线程 4 开始工作...
线程 1 正在处理任务 1...
线程 0 正在处理任务 1...
线程 3 正在处理任务 1...
线程 2 正在处理任务 1...
线程 4 正在处理任务 1...
线程 1 正在处理任务 2...
线程 0 正在处理任务 2...
线程 1 完成工作.
线程 2 正在处理任务 2...
线程 3 正在处理任务 2...
线程 4 正在处理任务 2...
...
线程 4 完成工作.
常用方法
Start()
- 描述: 启动线程,并执行与该线程关联的方法。
- 用法: 在创建
Thread
对象后,调用Start()
方法来启动线程。
Join()
- 阻塞主线程:当主线程调用
thread.Join()
时,它会被阻塞,直到thread
完成。也就是说,主线程不会继续执行后续的代码,直到这个线程的任务执行完毕。 - 确保执行顺序:使用
Join
方法的一个常见场景是,当你希望在所有子线程完成之前,确保主线程在做某些事情时,能够保证数据的一致性和正确性。例如,主线程可能需要处理子线程的结果,或者在所有任务完成后再进行下一个逻辑步骤。
using System;
using System.Threading;class Program
{static void Main(){Thread thread1 = new Thread(() => Compute(1));Thread thread2 = new Thread(() => Compute(2));thread1.Start(); // 启动线程1thread2.Start(); // 启动线程2// 等待线程完成thread1.Join(); // 主线程在这里停下来,等待线程1完成thread2.Join(); // 然后等待线程2完成Console.WriteLine("所有任务已完成。");}static void Compute(int id){Console.WriteLine($"任务{id}正在执行...");Thread.Sleep(2000); // 模拟一些工作Console.WriteLine($"任务{id}完成。");}
}
任务1正在执行...
任务2正在执行...
任务1完成。
任务2完成。
所有任务已完成。
Sleep(int millisecondsTimeout)
- 描述: 使当前线程暂停执行指定的毫秒数。可以用于控制线程的执行频率。
- 用法: 通常在执行任务过程中调用,以便适当地控制进程。
Abort()
- 描述: 强制终止线程的执行。需要注意的是,
Abort
方法是一个被认为是不安全和不推荐使用的方法。 - 用法: 由于可能导致资源泄漏和不确定的状态,建议使用其他机制(如标志或取消令牌)来停止线程。
using System;
using System.Threading;class Program
{static void Main(){Thread thread = new Thread(() => {try{while (true) { /* 持续工作 */ }}catch (ThreadAbortException){Console.WriteLine("线程被中止。");}});thread.Start();Thread.Sleep(1000); // 运行一段时间thread.Abort(); // 请求终止线程thread.Join(); // 等待线程完成}
}//输出: 线程被中止。
IsAlive
- 描述: 获取一个布尔值,指示线程是否仍在运行。可以用于在多线程环境中检查线程状态。
- 用法: 用于判断线程是否处于活动状态。
class Program
{static void Main(){Thread thread = new Thread(() => {Thread.Sleep(2000); // 模拟长时间任务});thread.Start();Console.WriteLine("Is thread alive? " + thread.IsAlive); // 输出truethread.Join();Console.WriteLine("Is thread alive? " + thread.IsAlive); // 输出false}
}
ManagedThreadId
- 描述: 获取当前线程的唯一标识符。这个ID可以用于跟踪和调试线程。
- 用法: 在需要识别特定线程时,可以使用该属性。
using System;
using System.Threading;class Program
{static void Main(){Thread thread = new Thread(() => {Console.WriteLine("当前线程的ManagedThreadId: " + Thread.CurrentThread.ManagedThreadId);});//当前线程的ManagedThreadId: 5(输出的ID可能会不同,因为它是在运行时生成的)thread.Start();thread.Join();}
}
SetApartmentState(ApartmentState)
- 描述: 设置线程的单元状态(Apartment State)。可以设置为
STA
(单线程单元)或MTA
(多线程单元)这会影响COM组件的使用。 - 用法: 在调用
Start()
方法之前设置。
Interrupt()
- 描述:
Interrupt()
方法用于中断一个正在等待、休眠或阻塞的线程。调用此方法时,如果目标线程处于阻塞状态(如调用Thread.Sleep()
或Thread.Join()
),该线程将抛出ThreadInterruptedException
异常,并可以立即恢复执行。对于任何未阻塞状态下的线程,Interrupt()
方法不会产生影响。 - 用法: 如果一个线程正在休眠或等待,可以使用
Interrupt()
来唤醒它。
using System;
using System.Threading;class Program
{static void Main(){// 创建一个线程,模拟一个长时间执行的操作Thread workerThread = new Thread(() =>{try{Console.WriteLine("线程正在休眠...");Thread.Sleep(10000); // 睡眠10秒Console.WriteLine("线程完成工作。");}catch (ThreadInterruptedException){Console.WriteLine("线程被中断!");}});// 启动线程workerThread.Start();// 主线程等待一段时间后中断子线程Thread.Sleep(2000); // 等待2秒Console.WriteLine("请求中断线程...");workerThread.Interrupt(); // 中断线程// 等待子线程完成workerThread.Join();Console.WriteLine("主线程结束。");}
}
线程正在休眠...
请求中断线程...
线程被中断!
主线程结束。
相关文章:
C# 线程--Thread类
目录 什么是线程? Thread类的定义 创建和启动线程 使用 ThreadStart 委托 使用 ParameterizedThreadStart 委托 Lambda简写 使用线程池(ThreadPool) 使用线程池的优点 使用 ThreadPool 的一般步骤 常用方法 Start() Join() Slee…...
【RK3588 Linux 5.x 内核编程】-内核高分辨率定时器
内核高分辨率定时器 文章目录 内核高分辨率定时器1、高分辨率定时器介绍2、高分辨率定时器API2.1 初始化定时器2.2 启动定时器2.3 停止定时器2.4 改变定时器超时时间2.5 定时器状态检查3、驱动实现4、驱动验证在前面的文章中,我们知道了如果在Linux内核中使用定时器。本文将详…...
论文阅读与源码解析:MogaNet
论文阅读与源码解析:MogaNet: Multi-order Gated Aggregation Network 论文地址:https://arxiv.org/pdf/2211.03295 GitHub项目地址:https://github.com/Westlake-AI/MogaNet 源码:https://github.com/Westlake-AI/MogaNet/blob/…...
长、宽数据表格转换
excel数据读取 使用 readxl 包读取 Excel 文件 library(readxl) 读取 Excel 文件: 使用 read_excel() 函数读取 .xlsx 或 .xls 格式的文件。可以选择指定工作表名或工作表索引。 # 读取 Excel 文件的默认工作表 data <- read_excel("path_to_y…...
华为 Mate 70 系列智能手机将运行不兼容 Android 的鸿蒙
华为宣布其 Mate 70 系列新智能手机将搭载不兼容 Android 的 HarmonyOS Next 操作系统。虽然是基于安卓系统的,但是该分叉树将正式分离。以后将不再兼容安卓系统软件。 HarmonyOS Next 可运行的应用数量仍然远远逊于 Android。华为表示 HarmonyOS Next 获得了逾 1.…...
【Halcon】 derivate_gauss
1、derivate_gauss Halcon中的derivate_gauss算子是一个功能强大的图像处理工具,它通过将图像与高斯函数的导数进行卷积,来计算各种图像特征。这些特征在图像分析、物体识别、图像增强等领域具有广泛的应用。 参数解释 Sigma:高斯函数的标准差,用于控制平滑的程度。Sigma…...
原型模式的理解和实践
引言 在软件开发中,我们经常需要创建具有相同属性或状态的对象。如果采用传统的构造函数或工厂模式来创建对象,那么每次创建对象时都需要重新设置对象的属性,这无疑增加了代码的冗余和复杂性。为了解决这一问题,原型模式ÿ…...
封装loding加载动画的请求
图片 /*** Loading 状态管理类*/ export class Loading {constructor(timer300) {this.value falsethis.timer timer}/*** 执行异步操作并自动管理 loading 状态* param {Promise|Function|any} target - Promise、函数或其他值* returns {Promise} - 返回请求结果*/async r…...
特种设备相关管理A全国通用试题
1.下列()类型的起重机械的定期检验每年1次。 A.机械式停车设备 B.施工升降机 C.门式起重机 D.桅杆式起重机 答案:B 2.压力容器安全技术监察规程中所指的容积,应为( )。 A.应当扣除永久连接在压力容器内部的内件…...
ES语法(一)概括
一、语法 1、请求方式 Elasticsearch(ES)使用基于 JSON 的查询 DSL(领域特定语言)来与数据交互。 一个 ElasticSearch 请求和任何 HTTP 请求一样由若干相同的部件组成: curl -X<VERB> <PROTOCOL>://&l…...
反射的作用
只要不是写死在程序里的对象的创建和调用,都可以用反射来实现。 例如,依据注解或配置信息动态生成并注入对象的需求场景,生成动态代理的需求场景。...
KARE:知识图谱社区级检索,增强 LLM 推理能力的医疗预测框架
KARE:知识图谱社区级检索,增强 LLM 推理能力的医疗预测框架 论文大纲理解要点全流程分析核心模式解法拆解知识图谱社区检索和普通检索有什么本质区别?为什么要同时使用专家LLM和本地LLM?动态知识检索中的评分机制是如何平衡多个因…...
LabVIEW氢气纯化控制系统
基于LabVIEW的氢气纯化控制系统满足氢气纯化过程中对精确控制的需求,具备参数设置、过程监控、数据记录和报警功能,体现了LabVIEW在复杂工业控制系统中的应用效能。 项目背景 在众多行业中,尤其是石油化工和航天航空领域,氢气作为…...
数据分析案例-笔记本电脑价格数据可视化分析
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
CSS函数
目录 一、背景 二、函数的概念 1. var()函数 2、calc()函数 三、总结 一、背景 今天我们就来说一说,常用的两个css自定义属性,也称为css函数。本文中就成为css函数。先来看一下官方对其的定义。 自定义属性(有时候也被称作CSS 变量或者级…...
Linux网络——传输层
目录 1. 再谈端口号 2. UDP ① UDP 协议的报文 ② UDP 协议报头的本质 3. TCP ① TCP 缓冲区的理解 ② TCP 协议的报文 1. 16位源端口号 && 16位目的端口号 && 4位首部长度 2. 16位窗口大小 3. 32位序号 && 32位确认序号 4. 六个标记位 ③…...
2024年认证杯SPSSPRO杯数学建模A题(第一阶段)保暖纤维的保暖能力全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 A题 保暖纤维的保暖能力 原题再现: 冬装最重要的作用是保暖,也就是阻挡温暖的人体与寒冷环境之间的热量传递。人们在不同款式的棉衣中会填充保暖材料,从古已有之的棉花、羽绒到近年来各种各样的人造纤维。不…...
采药 刷题笔记 (动态规划)0/1背包
P1048 [NOIP2005 普及组] 采药 - 洛谷 | 计算机科学教育新生态 动态规划 0/1背包 的本质在于继承 一行一行更新 上一行是考虑前i个物品的最优情况 当前行是考虑第i1个物品的情况 当前行的最优解 来自上一行和前i个物品的最优解进行比较 如果当前装了当前物品ÿ…...
LabVIEW MathScript工具包对运行速度的影响及优化方法
LabVIEW 的 MathScript 工具包 在运行时可能会影响程序的运行速度,主要是由于以下几个原因: 1. 解释型语言执行方式 MathScript 使用的是类似于 MATLAB 的解释型语言,这意味着它不像编译型语言(如 C、C 或 LabVIEW 本身的 VI&…...
大数据新视界 -- Hive 数据湖架构中的角色与应用(上)(25 / 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
电脑关机的趣味小游戏——system函数、strcmp函数、goto语句的使用
文章目录 前言一. system函数1.1 system函数清理屏幕1.2 system函数暂停运行1.3 system函数电脑关机、重启 二、strcmp函数三、goto语句四、电脑关机小游戏4.1. 程序要求4.2. 游戏代码 总结 前言 今天我们写一点稍微有趣的代码,比如写一个小程序使电脑关机…...
elasticsearch是如何进行搜索的?
请求与转发 协调节点确定参与搜索的目标索引,及其通过分片路由表确定分片对索引所在分片中选择任意节点并发请求多个分片的副本分片 副本选择策略 副本选择主要考虑 分片健康状态:选择状态为 green 或 yellow 的副本节点负载情况:避免查询…...
【Linux课程学习】:站在文件系统之上理解:软硬链接,软硬链接的区别
🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux学习笔记: https://blog.csdn.net/d…...
如何做好一份技术文档
要做好一份技术文档,你需要遵循以下步骤: 1. 明确文档目标: 确定文档的目的和受众。 了解受众的技术水平和背景,以便调整内容的深度和语言风格。 2. 收集信息: 搜集所有与主题相关的技术细节、数据、图表和…...
优雅关闭进程
原文地址:优雅关闭进程 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 介绍 本文涉及到进程对信号的响应,关于信号的一些基本知识,可以参考往期文章:linux系统信号简介 – 无敌牛 一个进程正常…...
【WEB开发.js】addEventListener事件监听器的绑定和执行次数的问题(小心踩坑)
假设我们有一个按钮,用户点击该按钮后,会选择一个文件,且我们希望每次点击按钮时只触发一次文件处理。下面我会给你一个简单的例子,展示放在函数内部和放在函数外部的区别。 1. 将事件监听器放在函数内部(问题的根源&…...
将 x 减到 0 的最小操作数 C++滑动窗口
给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 ,返回 最小操作数 &#x…...
深入解析 C++ 中的 common_reference_with 和 common_with:设计原理与复杂性
在 C 标准库的设计中,类型之间的兼容性和安全性是至关重要的,尤其是在泛型编程中。为了实现高效且安全的类型推导和转换,C 提供了一些复杂的概念和工具来确保不同类型之间能够正确协同工作。common_reference_with 和 common_with 这两个概念…...
从CPU缓存与指令重排序探讨JMM
目录 问题背景 解决思路 hb关系的应用 原子性问题 问题背景 1. 编译器和CPU优化: 编译器和CPU为了提升单线程程序的性能,会对代码进行优化,如指令重排序、延迟计算等。这些优化在单线程环境下不会影响程序的最终结果,但在多线…...
ETSI EN 300328 标准的一些笔记
ETSI - European Telecommunications Standards Institute 欧洲电信标准化协会 ETSI EN 300328 是欧洲协调标准,此标准适用于工作在2.4G频段范围内运行的宽频传输系统和设备的无线电频谱。 例如 WIFI、Zigbee、蓝牙、 (国内的星闪)。不涵盖UWB。 符合了EN 300328标…...
各大浏览器(如Chrome、Firefox、Edge、Safari)的对比
浏览器如Chrome、Firefox、Edge等在功能、性能、隐私保护等方面各有特点。以下是对这些浏览器的详细对比,帮助你选择合适的浏览器。 1. Google Chrome 市场份额:Chrome是目前市场上最流行的浏览器,约占全球浏览器市场的65%以上。 性能&#…...
AD7606使用方法
AD7606是一款8通道最高16位200ksps的AD采样芯片。5V单模拟电源供电,真双极性模拟输入可以选择10 V,5 V两种量程。支持串口与并口两种读取方式。 硬件连接方式: 配置引脚 引脚功能 详细说明 OS2 OS1 OS2 过采样率配置 000 1倍过采样率 …...
双向长短期记忆(Bi-LSTM)神经网络介绍
长短期记忆(Long Short-Term Memory, LSTM)神经网络: 1.是Hochreiter和Schmidhuber设计的循环神经网络(Recurrent Neural Network, RNN)的改进版本。LSTM模型借鉴了人类大脑的选择性输入和选择性遗忘机制,获取序列中的关键信息,遗忘和当前预测…...
openGauss开源数据库实战十八
文章目录 任务十八 openGauss逻辑结构:构:用户和权眼管理任务目标实施步骤一、准备工作二、用户和角色管理1.使用CREATE USER语句创建用户2.使用CREATE ROLE语句创建用户3.删除用户和角色 三、权限管理1.系统权限清理工作 任务十八 openGauss逻辑结构:构:用户和权眼管理 任务目…...
JVM 性能调优 -- JVM 调优常用网站
前言: 上一篇分享了 JDK 自带的常用的 JVM 调优命令和图形化界面工具,本篇我们分享一下常用的第三方辅助 JVM 调优网站。 JVM 系列文章传送门 初识 JVM(Java 虚拟机) 深入理解 JVM(Java 虚拟机) 一文搞…...
现在的电商风口已经很明显了
随着电商行业的不断发展,直播带货的热潮似乎正逐渐降温,而货架电商正成为新的焦点。抖音等平台越来越重视货架电商,强调搜索功能的重要性,预示着未来的电商中心将转向货架和搜索。 在这一转型期,AI技术与电商的结合为…...
基于AT89C52单片机的电子时钟与温湿度检测系统
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
Wwise SoundBanks内存优化
1.更换音频格式为Vorbis 2.停用多余的音频,如Random Container的随机脚步声数量降为2个 3.背景音乐勾选“Stream”。这样就让音频从硬盘流送到Wwise,而不是保存在内存当中,也就节省了内存 4.设置最大发声数Max Voice Instances 5.设置音频…...
Next.js 独立开发教程(十三):错误处理(Error Handling)
系列文章目录 Next.js 开发教程(一):入门指南-CSDN博客 Next.js 开发教程(二):从零构建仪表盘应用-CSDN博客 Next.js 开发教程(三):CSS 样式的完整指南-CSDN博客 Next.js 独立开发教程&…...
【Halcon】边缘检测算子汇总(一)
frei_amp 功能:使用Frei-Chen算法检测图像的边缘振幅。 参数: 输入图像(Image):待处理的原始图像。输出梯度图像(ImageEdgeAmp):经过Frei-Chen算法处理后的边缘振幅图像。工作原理:frei_amp算子通过计算图像一阶导数的近似值来检测边缘。它使用两个特定的滤波器掩模(…...
前端开发中Token存储:选择Cookie还是localStorage?
在现代前端开发领域,用户身份验证与状态管理不可或缺,而 token 作为身份验证机制的核心要素,对保障用户信息安全至关重要。然而,token 的存储方式对应用安全性和用户体验有着直接影响。本文将从安全性、便捷性和使用场景等维度,深度剖析在 Cookie 和 localStorage 中选择存…...
Scala中的正则表达式01
规则类型具体规则示例说明单字符大多数字符匹配自身正则表达式 abc,文本 abca 匹配 a,b 匹配 b,c 匹配 c方括号 [ ][ ] 定义字符集,匹配其一[abc],文本 a、b 或 c[abc] 匹配 a、b 或者 c排除字符集 [^ ][^ ] 开头加 ^&…...
机器学习——决策树模型
决策树是如何工作的? 假设你在经营一家猫收养中心,并提供了一些功能,你想训练一个分类器来快速告诉你,动物到底是不是猫,这里有10个训练例子,并与这10个例子中的每一个相关联,我们将有关于动物…...
#3003. Jed‘s MEX
刚开始直接硬来,要么TLE要么WA 后面改成另一种思路: 先把ai大于n的全都转换为刚好小于n的数,记录在cnt[i]中,代表ai有多少个 然后从高往低走,把cnt大于1的分到下面去,使数尽可能分布得广一些 然后从低往…...
数据集增强:提升深度学习模型泛化能力的关键技术
在深度学习中,数据是模型性能的基石。大规模、高质量的数据集通常能显著提高模型的泛化能力,帮助模型在真实场景中做出更准确的预测。然而,在很多实际应用中,数据收集困难、昂贵或者受限,尤其是当数据集相对较小或标注…...
JS实现高效导航——A*寻路算法+导航图简化法
一、如何实现两点间路径导航 导航实现的通用步骤,一般是: 1、网格划分 将地图划分为网格,即例如地图是一张图片,其像素为1000*1000,那我们将此图片划分为各个10*10的网格,从而提高寻路算法的计算量。 2、标…...
在wordpress添加自定义文章类型
实现思路 在Once主题中,有文章,页面等编辑的文案类型,文章类型主要做文案输出,而页面类型主要做一些界面菜单的操作。参考文章类型,使用自定义页面模板,实现一个自定义文章类型,例如**笔记(nod…...
[node.js] [HTTP/S] 实现 requests 发起 HTTP/S/1.1/2.0 请求
node.js 使用 V8 引擎来编译运行 javascript 代码,与浏览器中的环境不同的是,node.js 不包含 DOM 和 BOM 模块。 本文使用 node.js 的官方库来实现一个简单的 requests() 函数,可以用来发送 HTTP/1.1 和 HTTP/2.0 的请求。有关 HTTP/1.1 和 …...
基于Java Springboot线上约拍摄影预约微信小程序
一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui uniapp 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信开发者工…...
node.js基础学习-cheerio模块-简单小爬虫(五)
学习cheerio模块,简单做一个爬取图片网站的图片,并且将这些图片下载到本地指定的文件夹下,很多图片网站都有一些反爬取的机制,找的好几个都会报302错误,所以我找了一个小的图片网站,这个没有反爬取机制&…...