C#:多线程
一.线程常用概念
线程(Thread):操作系统执行程序的最小单位
进程(Process):程序在内存中的运行实例
并发(Concurrency):多个任务交替执行(单核CPU)
并行(Parallelism):多个任务同时执行(多核CPU)
同步(Synchronization):协调线程执行顺序
异步(Asynchronous):非阻塞的执行方式
二.使用多线程好处
- 提高性能:利用多核CPU并行执行任务
- 响应性:保持UI界面流畅,后台执行耗时操作
- 资源利用率:同时处理I/O密集型和CPU密集型任务
- 模块化:将复杂任务分解为独立执行的单元
三.使用Thread实现多线程
常用Thread中为ThreadStart,其中ThreadStart为委托类型,无参数无返回值委托
//Thread线程
public Thread(ThreadStart start)
//ThreadStart委托类型,为无参数无返回值类型
public delegate void ThreadStart();
定义一个无参数无返回值的函数,使用线程进行操作
static void Main(string[] args){//委托执行Thread t1 = new Thread(run);t1.Start();//匿名函数new Thread(()=>{for (int i = 0; i < 10; i++){Console.WriteLine($"线程B==>{i}");}}).Start();Console.WriteLine( "void Main执行完毕");}public static void run(){ for(int i = 0; i < 10; i++){Console.WriteLine($"线程A==>{i}");}}
打印结果:
void Main执行完毕
线程A==>0
线程A==>1
线程A==>2
线程A==>3
线程A==>4
线程A==>5
线程A==>6
线程A==>7
线程A==>8
线程A==>9
线程B==>0
线程B==>1
线程B==>2
线程B==>3
线程B==>4
线程B==>5
线程B==>6
线程B==>7
线程B==>8
线程B==>9
线程特性常用的属性获取,thread ID,name,IsAlive,IsBackground,使用线程A/B和主线程打印1-10的数字,其中IsAlive线程在运行中为True,线程在运行后为False,IsBackground指线程是否是后台线程,在程序执行过程中,前台线程执行完毕后,应用程序可以退出,后台线程则无所谓执行完成,应用程序均可以退出。默认情况下,Thread设定线程均是前台线程。
static void Main(string[] args)
{Thread t1 = new Thread(run);t1.Name = "ThreadA";t1.Start();Thread t2 = new Thread(() =>{for (int i = 0; i < 3; i++){Console.WriteLine($"线程ID:{Thread.CurrentThread.ManagedThreadId},线程名字{Thread.CurrentThread.Name}执行==>{i}");}});t2.Name = "ThreadB";t2.Start();Thread.CurrentThread.Name = "Main Thread";for (int i = 0; i < 3; i++){Console.WriteLine($"线程ID:{Thread.CurrentThread.ManagedThreadId},线程名字{Thread.CurrentThread.Name}执行==>{i}");}Console.WriteLine("void Main执行完毕");}
public static void run()
{ for(int i = 0; i < 3; i++){Console.WriteLine($"线程ID:{Thread.CurrentThread.ManagedThreadId},线程名字{Thread.CurrentThread.Name}执行==>{i}");}
}
打印结果,每次打印结果会有差异:
线程ID:3,线程名字ThreadA执行==>0
线程ID:3,线程名字ThreadA执行==>1
线程ID:3,线程名字ThreadA执行==>2
线程ID:1,线程名字Main Thread执行==>0
线程ID:4,线程名字ThreadB执行==>0
线程ID:4,线程名字ThreadB执行==>1
线程ID:4,线程名字ThreadB执行==>2
线程ID:1,线程名字Main Thread执行==>1
线程ID:1,线程名字Main Thread执行==>2
void Main执行完毕
线程调度:
t1.Priority=ThreadPriority.Highest; //线程优先级
bool a=Thread.Yield(); //线程礼让
Thread.Sleep(1000); //线程休眠
t1.Join(); //线程阻塞
线程安全:使用线程模拟12306抢票系统,由于线程是按照同步进行,如果对线程不进行约束,则会出现数据重复现象,用以下代码进行:
internal class Program{public int TotalTicket;public int CurrentTicket;static void Main(string[] args){Program program = new Program();program.TotalTicket = 5;program.CurrentTicket = 5;Thread t1 = new Thread(program.GetTicket);t1.Name = "黄牛";t1.Start();Thread t2 = new Thread(program.GetTicket);t2.Name = "小王";t2.Start();Thread t3 = new Thread(program.GetTicket);t3.Name = "小李";t3.Start();}public void GetTicket(){ while (true){if (CurrentTicket <= 0) {break; }//有票CurrentTicket--;Thread.Sleep(100);Console.WriteLine( $"{Thread.CurrentThread.Name}抢到了{TotalTicket-CurrentTicket}张票,剩余{CurrentTicket}张票");} }
运行结果,可见线程运行过程中使用同一数据元,由于电脑分配资源执行过程中间隔执行,数据源不安全:
小王抢到了3张票,剩余2张票
小李抢到了3张票,剩余2张票
黄牛抢到了3张票,剩余2张票
小王抢到了5张票,剩余0张票
小李抢到了5张票,剩余0张票
解决这个问题,使用线程锁,即当前线程执行完毕后再进行执行第二个线程,使用Lock,Lock是 C# 中的一种用于同步线程执行的机制,它帮助确保多个线程在访问共享资源时不会发生冲突或数据损坏。其作用是通过给临界区(即多线程访问共享资源的代码段)加锁,使得在同一时刻只能有一个线程进入执行该代码段。:
internal class Program
{public int TotalTicket;public int CurrentTicket;private readonly object o = new object(); //设定一个对象static void Main(string[] args){Program program = new Program();program.TotalTicket = 5;program.CurrentTicket = 5;Thread t1 = new Thread(program.GetTicket);t1.Name = "黄牛";t1.Start();Thread t2 = new Thread(program.GetTicket);t2.Name = "小王";t2.Start();Thread t3 = new Thread(program.GetTicket);t3.Name = "小李";t3.Start();
}
//利用Lock对线程进行互斥锁定public void GetTicket(){ while (true){lock(o){if (CurrentTicket <= 0){break;}//有票CurrentTicket--;Thread.Sleep(100);Console.WriteLine($"{Thread.CurrentThread.Name}抢到了{TotalTicket - CurrentTicket}张票,剩余{CurrentTicket}张票");}} }
打印结果,同一资源则不会进行数据丢失:
小李抢到了1张票,剩余4张票
黄牛抢到了2张票,剩余3张票
小王抢到了3张票,剩余2张票
小李抢到了4张票,剩余1张票
黄牛抢到了5张票,剩余0张票
相关文章:
C#:多线程
一.线程常用概念 线程(Thread):操作系统执行程序的最小单位 进程(Process):程序在内存中的运行实例 并发(Concurrency):多个任务交替执行(单核CPU࿰…...
虚拟币制度钱包开发:功能设计与成本全解析
虚拟币制度钱包开发:功能设计与成本全解析 ——从基础架构到合规风控的完整解决方案 一、开发成本:分层定价与关键影响因素 根据2024-2025年行业数据显示,虚拟币钱包App开发成本跨度较大,主要受功能复杂度、技术架构与合规要求三…...
TransmittableThreadLocal实现上下文传递-笔记
1.TransmittableThreadLocal简介 com.alibaba.ttl.TransmittableThreadLocal(简称 TTL)是阿里巴巴开源的一个工具类,旨在解决 ThreadLocal 在线程池中无法传递上下文变量 的问题。它是对 InheritableThreadLocal 的增强,尤其适用…...
应对WEEE 2025:猎板PCB的区块链追溯与高温基材创新
在全球电子产业加速向循环经济转型的背景下,欧盟《绿色新政》与《WEEE指令》对PCB行业提出更高要求。作为行业先行者,猎板PCB(Hunter PCB)以生物降解基材为核心,结合全球合规体系与产业链协同创新,构建从材…...
大陆资产在香港发行RWA的合规路径与核心限制
大陆资产在香港发行RWA的合规路径与核心限制 ——从“双重合规原则”到资产准入边界的全景解读 一、法律框架:双重合规原则的刚性约束 根据香港金管局Ensemble沙盒项目要求,大陆资产在香港发行RWA需遵循“双重合规原则”,即底层资产需同时符…...
爬虫攻防战:从入门到放弃的完整对抗史与实战解决方案
爬虫攻防战:从入门到放弃的完整对抗史与实战解决方案 这张有趣的图片生动描绘了爬虫开发者与反爬工程师之间的"军备竞赛"。作为技术博主,我将基于这张图的各个阶段,深入分析爬虫技术的演进与对应的反制措施,提供一套完整的反爬解决方案,包括技术原理、实施方法…...
Fabric初体验(踩坑笔记)
搭建fabric部署合约学习笔记 环境准备CURl安装docker 参照官网文档实现(2025.05.19)根据前言交代的文章去尝试(失败版)安装fabric-samples安装指定2.2.0版本Fabric二进制文件和配置文件直接手动下载(不建议)…...
区块链blog2_中心化与效率
🌿中心化出现原因 信息/服务分散在各处会浪费时间且不方便使用,由此,把信息/服务集中在一起,便于管理,避免了不必要的效率损失。 即集中资源,使得对信息处理的全过程效率升高。中心化不是网络中产生的&…...
2024年ASOC SCI2区TOP,多机制群优化算法+多风场输电线路巡检中多无人机任务分配与路径规划,深度解析+性能实测
目录 1.摘要2.考虑风场影响的多无人机任务分配3.基于双向蚁群和离散蜜獾算法求解多无人机任务分配问题(BACOHBA)4.考虑风场的多无人机路径规划5.结果展示6.参考文献7.代码获取8.读者交流 1.摘要 随着电力系统规模的不断扩大,复杂环境下的电力线路及设施的巡检与维护…...
智慧赋能光伏运维——无人机巡检+地面监控双链路覆盖,打造光伏电站管理新标杆
一、引言:光伏电站运维的挑战与机遇 在全球能源转型浪潮下,光伏电站作为清洁能源的重要载体,其高效运维管理成为行业核心命题。然而,传统光伏电站运维存在覆盖范围广、设备分散、人工巡检效率低、故障响应慢等痛点。为破解这一难…...
c/c++的opencv开闭操作
OpenCV 中的形态学开运算与闭运算 (C) 在计算机视觉和图像处理领域,形态学操作是用于分析和处理图像形状的一系列非线性操作。OpenCV 作为一个强大的开源计算机视觉库,提供了丰富的形态学转换函数。其中,“开运算”(Opening&…...
Linux利用多线程和线程同步实现一个简单的聊天服务器
1. 概述 本文实现一个基于TCP/IP的简单多人聊天室程序。它包含一个服务器端和一个客户端:服务器能够接收多个客户端的连接,并将任何一个客户端发来的消息广播给所有其他连接的客户端;客户端则可以连接到服务器,发送消息并接收来自…...
无人机遥控器光纤通信模块技术要点!
一、技术要点 1. 长距离低损耗传输 采用单模光纤(如G.654.E光纤),利用光纤的低衰减特性(0.17 dB/km以下),支持10公里以上的远距离通信,突破了传统无线信号因衰减导致的覆盖限制。例如&…...
深入解析OkHttp与Retrofit:Android网络请求的黄金组合
前言 在移动应用开发中,网络请求是连接客户端与服务器的关键桥梁。对于Android开发者而言,OkHttp和Retrofit这对组合已经成为处理网络请求的事实标准。本文将全面剖析这两个框架的设计理念、核心功能、协同关系以及最佳实践,帮助开发者构建高…...
Python操作PDF书签详解 - 添加、修改、提取和删除
目录 简介 使用工具 Python 向 PDF 添加书签 添加书签 添加嵌套书签 Python 修改 PDF 书签 Python 展开或折叠 PDF 书签 Python 提取 PDF 书签 Python 删除 PDF 书签 简介 PDF 书签是 PDF 文件中的导航工具,通常包含一个标题和一个跳转位置(如…...
Spring Boot与Kafka集成实践:从入门到实战
Spring Boot与Kafka集成实践 引言 在现代分布式系统中,消息队列是不可或缺的组件之一。Apache Kafka作为一种高吞吐量的分布式消息系统,广泛应用于日志收集、流处理、事件驱动架构等场景。Spring Boot作为Java生态中最流行的微服务框架,提供…...
luckysheet的使用——17.将表格作为pdf下载到本地
luckysheet源码里面自带有打印按钮,但是功能是无法使用的,所以我把该功能重写了一遍 1.在menuButton.js文件中找到源码打印按钮的触发事件: $("#luckysheet-icon-print").click(function () {}2.使用自己写的挂载方法 window.pr…...
矿井支架LCYVB-6钢丝编织护套连接器介绍
LCYVB-6钢丝编织护套连接器是一种专为矿井支架设计的连接装置,主要用于增强支架的稳定性和安全性。该连接器采用高强度钢丝编织护套,具有优异的抗拉强度和耐磨性,适用于恶劣的矿井环境。 主要特点 高强度钢丝编织护套:采用优质钢…...
git仓库中.git 文件很大,怎么清理掉一部分
查询 .git 文件大小,在 git-bash 里执行(后面有些命令不能执行,也请在 git-bash 里执行) windows11 安装好后右键没有 git bash 命令-CSDN博客 du -sh .git // 592m .git 操作前最好先备份一份,避免推送到远程时出错…...
Qt框架核心组件完全指南:从按钮交互到定时器实现
文章目录 前言一、QAbstractButton 按钮类概述1.1 常用属性1.2 常用信号1.3QButtonGroup 按钮组 二、QComboBox 组合框三、若干与数字相关的组件四、QString 字符串类五、Qt容器类5.1 顺序容器 QList5.2 关联容器 QMap 六、QVariant七、跨平台数据类型7.1 基础数据类型7.2 特殊…...
Axure设计数字乡村可视化大屏:从布局到交互的实战经验分享
乡村治理正从传统模式向“数据驱动”转型。数字乡村可视化大屏作为数据展示的核心载体,不仅能直观呈现乡村发展全貌,还能为决策提供科学依据。本文以Axure为工具,结合实际案例,分享如何从零设计一个功能完备、交互流畅的数字乡村大…...
60天python训练计划----day30
DAY 30 模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 一.导入官方库 我们复盘下学习python的逻辑,所谓学习pyth…...
HJ3 明明的随机数【牛客网】
文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 快排去重3.2 散列 四、参考代码4.1 快排去重4.2 散列 零、原题链接 HJ3 明明的随机数 一、题目描述 二、测试用例 三、解题思路 3.1 快排去重 基本思路: 先将序列进行快速排序,然后…...
BGP选路
一、拓扑图 二、要求及分析 1.要求 1.使用Preva1策略,确保R4通过R2到达192.168.10.0/24 2、用As Path策略,确保R4通过R3到达192.168.11.0/24 3.配置MED策略,确保R4通过R3到达192.168.12.0/24 4.使用Local Preference策略,确保…...
践行“科学智能”!和鲸打造 AI for Science 专属应用
AI for good, AI for Science. 在传统科研领域,人力与经验的局限始终如影随形。而“AI for Science”正逐渐改变科学研究的模式,以科学数据为基石、以强大算力为支撑,借助人工智能技术,开展计算密集度高且能够实现高效迭代的科学…...
【vs2022的C#窗体项目】打开运行+sql Server改为mysql数据库+发布
1. vs2022打开运行原sql Server的C#窗体项目更改为mysql数据库 1.1. vs2022安装基础模块即可 安装1️⃣vs核心编辑器2️⃣.net桌面开发必选,可选均不安装!!! 为了成功连接mysql数据库,需要安装组件NuGet包管理器 安…...
wpf DataGrid 行选择事件
在WPF中处理DataGrid行选择事件主要有以下几种实现方式: 1.SelectionChanged事件处理 通过直接订阅DataGrid的SelectionChanged事件实现行选择响应: <DataGrid SelectionChanged="DataGridAccurateLocationList_SelectionChanged" .../>后台代码中处理…...
Spring Cloud Seata 深度解析:原理与架构设计
文章目录 前言:为什么我们需要理解分布式事务?一、Seata 核心架构深度拆解1.1 分布式事务核心模型1.2 Seata undo_log 存储结构与版本控制存储结构版本控制核心算法 1.3 Seata 事务模型深度对比与实现原理AT 模式(Auto Transaction࿰…...
从产品展示到工程设计:3DXML 转 STP 的跨流程数据转换技术解析
在数字化设计与制造领域,不同格式的三维模型文件常常需要进行转换,以满足不同软件和工作流程的需求。3DXML 和 STP(STEP AP214/AP242)是工业领域常用的两种三维模型文件格式,3DXML 格式以其轻量化和便于网络传输、可视…...
基于RT-Thread的STM32F4开发第五讲——软件模拟I2C
文章目录 前言一、RT-Thread工程创建二、AT24C02三、函数编写1.I2C_soft.c2.I2C_soft.h3.main.h 四、效果展示五、资源分享总结 前言 本章是基于RT-Thread studio实现软件模拟I2C,开发板是正点原子的STM32F4探索者,使用的RT-Thread驱动是5.1.0࿰…...
pkucpc2025 L:Game on Tree
题意 两个人在一棵无根树上玩游戏,每次可以删掉若干个叶子节点,不能操作的人输。 思路 比赛的时候我去写H Quintuple了,队友貌似在我写的时候把这道题讨论出来了。 后来补题的时候花了大概花了70分钟左右ac这道题。 首先考虑一条链的情况…...
大数据实时分析:ClickHouse、Doris、TiDB 对比分析
随着企业对数据分析实时性、复杂性和多样性的要求越来越高,传统的批处理数仓已经无法满足实时指标看板、流量监控、用户行为分析等场景需求。因此,越来越多的公司开始引入实时分析型数据库系统。 目前,国内外常见的实时分析数据库有: ClickHouse:列式数据库,极致的分析性…...
网络流量分析系统的十大应用场景
在现代企业和组织的IT运维体系中,网络流量分析系统(Network Traffic Analysis, NTA)早已不仅仅是用来查看带宽使用率的“流量计数器”。随着网络环境的复杂化、攻击技术的不断演进,以及对业务连续性要求的提升,网络流量…...
问题 | 代码审查:函数是否包含返回语句
“函数是否包含返回语句”这一问题的核心是:在编程中,函数是否按照设计要求正确使用了 返回语句(如 return、return value),以便向调用者传递结果或控制权。以下是详细解释: 1. 什么是函数的返回语句&#…...
Spring Bean 生命周期中设计模式的应用与解析
Spring Bean 生命周期中使用的设计模式 Spring Bean 的生命周期涉及多个阶段和扩展点,Spring 框架在这一过程中巧妙运用了多种设计模式,以实现强大的功能和灵活性。以下是主要设计模式及其应用场景: 1. 工厂模式(Factory Patter…...
设计模式的原理及深入解析
创建型模式 创建型模式主要关注对象的创建过程,旨在通过不同的方式创建对象,以满足不同的需求。 工厂方法模式 定义:定义一个创建对象的接口,让子类决定实例化哪一个类。 解释:工厂方法模式通过定义一个创建对象的…...
kotlin flow的两种SharingStarted策略的区别
一 两种 SharingStarted 策略的区别: SharingStarted.Eagerly: 立即开始收集上游流,即使没有下游订阅者持续保持活跃状态,直到 ViewModel 被清除优点:响应更快,数据始终保持最新缺点:消耗更多资源&#x…...
BGP综合实验(2)
一、实验需求 1、实验拓扑图 2、实验需求 使用 PreVal 策略,让 R4 经 R2 到达 192.168.10.0/24 。 使用 AS_Path 策略,让 R4 经 R3 到达 192.168.11.0/24 。 配置 MED 策略,让 R4 经 R3 到达 192.168.12.0/24 。 使用 Local Preference 策…...
python使用jsonpath-ng库操作json数据
jsonpath-ng 库的详细使用如下: 一、安装与导入 安装 通过 pip 安装库: pip install jsonpath-ng支持 Python 3.6 及以上版本。 导入核心模块 主要使用 parse 函数和 JSONPath 对象: from jsonpath_ng import parse二、基础查询操作 1. 简单…...
通用简洁工作汇报项目评估营销策划工作总结年终汇报PPT模版8套一组分享
工作总结汇报PPT模版8套一组分享:工作总结汇报PPT模版分享https://pan.quark.cn/s/04b7ab7a47c4 第一套PPT模版,主要是黄色和灰色调,上方有大面积黄色不规则形状背景,有“POWERPOINT”和“XXXXPPT模版”字样,左侧是黑…...
掌握Git:版本控制与高效协作指南
一、初始Git 提出问题:无论是在工作还是学习,我们在编写各种文档的时候,更改失误,失误后恢复到原来版本,不得不复制出一个副本。 每个版本由各自的内容,但最终只有一个报告需要被我们使用。 但在此之前的…...
ubuntu下配置vscode生成c_cpp_properties.json
-------------学习记录--------------- 在ubuntu下使用vscode时发现cpp文件无法读到头文件,明明头文件在合适的路径下,由于没有制定头文件的路径造成的这个问题。用这篇文章进行简单记录解决方法 ctrlshiftp打开命令面板,也可以点击左上角, …...
Qt读取Excel文件的技术实现与最佳实践
目录 一、成果展示二、核心方法及原理1. QAxObject(基于COM接口)2. 第三方库QXlsx3. ODBC数据库驱动 三、实现步骤详解1. QAxObject读取Excel(需安装Excel/WPS)2. QXlsx读取Excel(跨平台方案) 四、技术选型…...
双条件拆分工作表,一键生成独立工作簿-Excel易用宝
你是否遇到过这样的崩溃瞬间?面对一张密密麻麻的销售数据表,需要按指定维度拆分成工作簿和工作表,而你却只能手动复制粘贴到不同工作簿、工作表,改一个字段就花半小时,数据量大时甚至要熬夜加班? 别担心&a…...
iOS 蓝牙开发中的 BT 与 BLE
在 iOS 开发者的语境里,大家把 BT 和 BLE 当成两种不同的蓝牙技术在谈——它们来自同一个 Bluetooth 规范,但面向的场景、协议栈乃至 Apple 提供的 API 都截然不同。 缩写全称 / 技术名称规范层叫法iOS 支持现状典型用途BTBluetooth Classic(经典蓝牙)又叫 BR/EDR(Basic R…...
TCP和套接字SSL加密连接行为分析
目录 一、前言 二、背景 三、参数介绍 3.1、 have_openssl 3.2、have_ssl 3.3、require_secure_transport 四、--ssl-modemode 五、CREATE USER SSL/TLS选项 六、问题验证 6.1、使用套接字连接 6.2、使用TCP连接 七、分析与总结 一、前言 SSL(Secure S…...
kafka 问与答
kafka Q&A How does the client connect to kafka and discovery the brokers. client 只需要知道一部分nodes(brokers)的地址既可以,client 会自动发现剩下的所有topic partition leader nodes, 然后连接上。 When a client connects:It uses the bootstrap…...
docker默认存储迁移
在容器化场景下默认存储路径为(/var/lib/docker)大多数平台根目录不支持系统盘扩容,会有空间不足风险隐患,因未配置持久化存储导致容器数据丢失。以迁移Docker存储路径至大容量/data目录说明 一、停止容器 systemctl stop docke…...
Ubuntu20.04系统下使用交叉编译工具链(aarch、x86)交叉编译opencv4.5.0
文章目录 0. 引言1. 准备交叉编译工具链2. 安装依赖工具3. 下载 OpenCV 源码4. 创建交叉编译工具链文件5. 配置 CMake 构建6. 构建 OpenCV7. 安装 OpenCV8. 验证9. 问题及解决办法 0. 引言 Ubuntu20.04系统下使用交叉编译工具链(aarch、x86)交叉编译ope…...
R语言数据可视化
R note book 文档–输出html格式文档,plotly不能生成PDF文件 --- title: "R语言数据可视化" output: html_notebook ---在R语言中进行数据可视化是数据分析和呈现的重要环节,R提供了多种强大的绘图系统和工具。以下是常见的数据可视化方法和示…...