简单了解线程和协程(C#)

article/2025/11/6 8:54:00

1.为什么需要线程和协程:
(1)使程序中的任务可以并发执行,让程序同时处理多个任务,提高程序的运行效率和响应速度
(2)线程和协程可以共享同一个进程的资源,避免多个进程之间的资源浪费
(3)可以动态调整程序的并发度,从而提高程序的可伸缩性,以便适应不同的负载情况
(4)将程序拆分为多个任务,使程序的结构更清晰,更易维护
2.线程和协程的区别:线程是由操作系统调度的,而协程则是由程序自身控制的。
线程的应用:
(1) 可以将一些耗时的操作放在子线程中进行,避免阻塞主线程,提高用户体验。
(2) 线程可以用来处理一些实时性要求比较高的任务,如网络通信、I/O操作等。
协程的应用:
(1)可以用来实现游戏中的动画效果,如角色的移动、攻击等。

(2)可以用来实现服务器中的异步请求处理,如异步读取数据库、异步处理请求等。

 一、线程
1..Thread类的一些属性

using System;
using System.Threading;namespace ThreadTest
{internal class Program{static void Main(string[] args){ThreadStart childRef = new ThreadStart(ChildMethod);Thread th=new Thread(ChildMethod);th.Start();//Thread类的一些属性,属性表示的意思,可参考:https://www.runoob.com/csharp/csharp-multithreading.htmlConsole.WriteLine(Thread.CurrentContext);Console.WriteLine(Thread.CurrentPrincipal);Console.WriteLine(Thread.CurrentThread);//获取当前正在运行的线程Console.WriteLine(th.CurrentCulture);Console.WriteLine(th.CurrentUICulture);Console.WriteLine(th.ExecutionContext);Console.WriteLine(th.IsAlive);//获取表示当前线程执行状态的一个值Console.WriteLine(th.IsBackground);是否为后台线程Console.WriteLine(th.IsThreadPoolThread);Console.WriteLine(th.ManagedThreadId);Console.WriteLine(th.Name);//获取或设置线程的名称Console.WriteLine(th.Priority);//获取或设置线程的调度优先级Console.WriteLine(th.ThreadState);}static void ChildMethod(){Thread.Sleep(2000);//线程休眠,让线程暂停一段时间Console.WriteLine("Child");}}
}

 2.创建线程

using System;
using System.Threading;namespace ThreadTest
{internal class Program{static void Main(string[] args){//第一种方式,通过ThreadStart线程入口创建,它是一个无参无返回值的委托Thread th1 = new Thread(new ThreadStart(ThreadTest));//第二种方式,直接传递方法,这方式本质是与第一种方式是一样的,直接传递方法后,Thread内部会自动转成ThreadStart,因此一般情况不用担心因为重载问题而使它报错,因为TreadStart是无参无返回值的,它会自动匹配对应的方法类型,如果没有找到对应的类型就会提示报错Thread th2 = new Thread(ThreadTest1);//第三种方式,通过ParameterizedThreadStart创建,它是一个有参无返回值的委托,且只有一个参数Thread th3=new Thread(new ParameterizedThreadStart(ThreadTest2));//第四种方式,使用Lambda表达式创建线程,可以自己定义参数的传递//至于为什么可以这样写,可以参考:https://www.cnblogs.com/eve612/p/14342087.htmlThread th4 = new Thread(() => ThreadTest3("Lambda","很好用"));th1.Start();//开启线程th2.Start();th3.Start();th4.Start();}static void ThreadTest(){Console.WriteLine("Thread");}static void ThreadTest1(){Console.WriteLine("Thread1");}static void ThreadTest2(object obj){Console.WriteLine("ParameterizedThreadStart");}static void ThreadTest3(string str,string info){Console.WriteLine(str+info);}}
}

更多内容:https://www.cnblogs.com/eve612/p/14342087.html

3.终止线程

using System;
using System.Threading;
using System.Threading.Tasks;namespace ThreadTest
{internal class Program{static void Main(string[] args){Console.WriteLine("主线程开始");Thread th = new Thread(new ThreadStart(Test));th.Start();Thread.Sleep(1000);//线程休眠,阻止当前线程1s//终止进程,会引发ThreadAbortException异常//th.Abort();th.Abort("我们要终止子线程");//重载方法,终止进程的同时传递终止的异常信息Console.WriteLine("主线程结束");}static void Test(){try{Console.WriteLine("子线程开始");for(int i=0;i<10;i++){Thread.Sleep(400);Console.WriteLine(i);}}catch(ThreadAbortException e){//Console.WriteLine(e.Message);Console.WriteLine(e.ExceptionState);//打印终止的异常信息}finally{Console.WriteLine("捕获不到异常");}Console.WriteLine("子线程结束");}}
}

4.线程优先级:每个线程都有一个默认优先级,优先级高的线程相对于低级别的线程更有机会被优先调度,但并非绝对的。(优先级值从高到低:Highest,AboveNormal,Normal,BelowNormal,Lowest)

using System;
using System.Threading;namespace ThreadTest
{internal class Program{static void Main(string[] args){Thread th1 = new Thread(new ThreadStart(Test));Thread th2 = new Thread(new ThreadStart(Test2));th2.Priority=ThreadPriority.Highest;th1.Priority=ThreadPriority.Lowest;th1.Start();th2.Start();}static void Test(){for(int i = 0; i < 10; i++){Console.WriteLine("子线程1");}}static void Test2(){for (int i = 0; i < 10; i++){Console.WriteLine("子线程2");}}}
}

5.Lock:实现线程同步
线程同步:一个线程要等待上一个线程执行完之后才能开始执行当前线程
线程异步:线程各走各的,不需要相对等待就开始执行

using System;
using System.Threading;namespace ThreadTest
{internal class Program{static LockTest kt=new LockTest();static void Main(string[] args){Thread th1 = new Thread(new ThreadStart(kt.Test));Thread th2 = new Thread(new ThreadStart(kt.Test2));th1.Start();th2.Start();}}public class LockTest{public void Test(){lock (this)//给线程加锁,确保代码块能完整运行,而不会被其它线程打断,this不能在静态方法中使用{for (int i = 0; i < 10; i++){Console.WriteLine("子线程1");}}}public void Test2(){lock(this){for (int i = 0; i < 10; i++){Console.WriteLine("子线程2");}}}}
}

参考:

https://www.cnblogs.com/zhan520g/p/11388591.html
https://blog.csdn.net/u012395622/article/details/46581359
https://www.runoob.com/csharp/csharp-multithreading.html
https://blog.csdn.net/m0_67296957/article/details/126910726
https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.thread?view=net-7.0

二、协程:在主程序运行的同时,开启另外一段逻辑处理,来协助主程序的执行。在Unity中使用协程,大多数情况是为了延时调用某个功能方法、模块
注:如果开启的协程比较多,多个高开销的协程在同一帧执行会导致卡顿,因此常用于并行性要求不高的并行操作或延时执行等控制时间轴的操作(对于延时调用,Unity还有一个Invoke函数,但是Invoke所要调用的函数必须是在当前类里面的方法)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class IEnumeratorTest : MonoBehaviour
{Coroutine mCoroutine=null;//定义协程WaitForSeconds waitS = new WaitForSeconds(5.0f);// Start is called before the first frame updatevoid Start(){//调用和暂停协程//方式一//StartCoroutine(Test());//StopCoroutine(Test());这种方式无法停止协程//方式二//StartCoroutine("Test");//StopCoroutine("Test");//可以暂停协程//方式三mCoroutine = StartCoroutine(Test());//StopCoroutine(mCoroutine);//可以暂停协程}//协程函数IEnumerator Test(){Debug.Log("开始");//yield的多用方法://yield return new WaitForEndOfFrame();//每帧结束后再执行//yield return new WaitForFixedUpdate();//等待FixEdUpdate结束后再执行//yield return new WaitForSeconds(5.0f);//等待5s后执行//用全局中断指令来控制//yield return waitS;//等待5s后执行yield return StartCoroutine(Test2());//在协程中开启协程,协程一旦开启,就会立即执行Show();Debug.Log("等待了5s");} IEnumerator Test2(){//yield return new WaitForSeconds(2.0f);//程序等待N秒后从当前位置继续执行//yield return null;//程序在下一帧中从当前位置继续执行//yield return 0;//程序在下一帧中从当前位置继续执行yield break;//直接终止协程Debug.Log("第二个协程");}void Show(){Debug.Log("Show");}
}

参考:Unity C# 协程:(开始一个协程、停止一个协程、优化协程、协程中yield的用法)_c#停止协程_Iamzls的博客-CSDN博客

结语:合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。


http://chatgpt.dhexx.cn/article/xR4rlJtm.shtml

相关文章

线程与协程

线程与协程 概念进程【进程间通信&#xff08;IPC&#xff09;】 线程协程 区别场景计算密集型IO密集型两种操作如何优化哪些语言对多协程的支持 概念 进程 二进制可执行文件在计算机内存里的一个运行实例。比如.exe文件是个类&#xff0c;进程就是new出来的那个实例&#xf…

总结:协程与线程

一、介绍 本文主要梳理下进程&#xff0c;线程&#xff0c;协程的概念、区别以及使用场景的选择。 二、进程 我们知道&#xff0c;一切的软件都是跑在操作系统上&#xff0c;真正用来干活 (计算) 的是 CPU。早期的操作系统每个程序就是一个进程&#xff0c;知道一个程序运行完…

Java线程协程

目录 线程的实现&#xff08;OS&&JVM&#xff09; 1.内核线程实现 2.用户线程实现 3.混合实现 4.Java线程的实现 ——如何实现不受Java虚拟机规范的约束 Java线程调度——系统自动完成&#xff08;可能被干预&#xff09; Java线程状态转换 内核线程的局限 协…

CDH6.3.2安装文档

正式安装之前&#xff0c;先说明一下CDH是基于Apache Hadoop及相关项目的发行版。CDH通过WEB界面管理&#xff0c;并提供了hadoop的两个核心功能&#xff1a;可扩展存储和分布式计算&#xff0c;以及企业级的重要功能。CDH是遵循Apache-licensed的开源软件&#xff0c;提供了基…

CDH数仓项目(一) —— CDH安装部署搭建详细流程

0 说明 本文以CDH搭建数据仓库&#xff0c;基于三台阿里云服务器从零开始搭建CDH集群&#xff0c;节点配置信息如下&#xff1a; 节点内存安装服务角色chen10216Gcloudera-scm-serverchen1038Gcloudera-scm-agentchen1048Gcloudera-scm-agent 上传需要用到的安装包&#xff…

CDH5.8安装说明

#CDH5.8安装说明 (Hadoop) 使用过Ambari&#xff0c;不知道是因为没有商业运作支撑还是社区活跃度有限&#xff0c;总体管理能力只能算凑合。很多Hadoop组件版本都不高&#xff0c;Spark也才1.3.X&#xff0c;Sqoop还是1.4.6.2.3&#xff0c;相对版本都比较低&#xff0c;而且…

大数据CDH安装详细教程

1.环境准备 1.1 服务器配置(理想配置) 1.2 修改主机名和hosts文件(所有节点) [roothadoop001 ~]# vim /etc/hosts vim /etc/hostname1.3 关闭防火墙 systemctl stop firewalld systemctl disable firewalld1.4 SSH免密登录(主节点) ssh-keygen -t rsa #分发到所有节点 ssh…

CDH6安装

官方文档 https://www.cloudera.com/documentation/enterprise/6/6.0/topics/installation.html 安装之前 JDK兼容性在不同的Cloudera Manager和CDH版本中也有所不同。某些版本的CDH 5与JDK 7和JDK 8兼容。在这种情况下&#xff0c;请确保所有服务都部署在同一主要版本上。例…

Cloudera(CDH) 简介和在线安装

实验背景 笔者需要维护线上的hadoop集群环境&#xff0c;考虑在本地搭建一套类似的hadoop集群&#xff0c;便于维护与管理。 Cloudera 简介 经过搜索发现Cloudera产品很适合笔者当前需求&#xff0c;于是开始研究Cloudera&#xff08;CDH&#xff09;的安装与使用&#xff0c;参…

CDH6.3.1安装

CDH6.3.1安装遇到很多问题&#xff0c;我想主要是由于条件有限&#xff0c;毕竟自己的电脑内存不如专业集群的内存大&#xff08;如果是内存和硬盘充足&#xff0c;有些是可以避免的&#xff0c;甚至不会出现报错的情况&#xff09;&#xff0c;这里就介绍一下我用VMware安装的…

CDH安装配置

Cloudera5.14配置 准备工作 软件下载软件安装 JDK安装 所有节点 安装环境变量配置 sudo vim /etc/profile export JAVA_HOME/usr/java/default export PATH$JAVA_HOME/bin:$PATH 使用root用户 echo "JAVA_HOME/usr/java/default" >> /etc/environment …

CDH 6.3.2 安装(一)

目录 一、CDH框架介绍 1、CDH介绍 2、CDH官方网址 3、CDH官方文档 4、CDH集群扩容 5、CDH硬件要求 6、CDH k8s服务开启 二、CDH依赖安装 1、安装通用依赖 2、网络工具安装 3、防火墙服务安装 4、进程树形工具安装 5、其它依赖安装 三、Linux系统配置 1、主机名配…

CDH安装手册(自整理)

文章目录 前言1.组件版本2.集群规划&#xff08;三台服务器为例&#xff09;3.配置linux静态IP4.修改hosts文件&#xff0c;并实现免密登录5.创建集群分发脚本6.关闭防火墙和SELINUX&#xff08;所有节点&#xff09;7.配置NTP时钟同步8.安装jdk和mysql9.搭建本地yum源并安装10…

安装篇2 - 安装CDH

登陆Cloudera Manager平台 http://192.168.60.100:7180 账号密码&#xff1a;admin/admin 1.1 1.2 1.3 免费 2.1 2.2 2.3 2.4 选择CDH和Flink 2.5 将parcel包内的Hadoop&#xff0c;Hive等组件分发到各个节点进行解压激活 2.6 3.1 自行选择 自定义选择Zookeeper&#xff…

CDH5(CDH 5.16.1)安装

日萌社 人工智能AI&#xff1a;Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战&#xff08;不定时更新&#xff09; CDH 6系列&#xff08;CDH 6.0.0、CDH 6.1.0、CDH 6.2.0等&#xff09;安装和使用 CDH5&#xff08;CDH 5.16.1&#xff09;安装 linux配置 1.…

CDH 6.3.2 安装(二)

目录 一、网络配置 1、静态网卡配置 2、网关配置 3、停止networkManager服务 4、重启网卡服务 二、配置静态网卡 1、修改网络配置 2、修改主机名 三、加载MySQL驱动包 1、准备文件 2、下载地址 3、加载MySQL驱动包 四、安装 cloudera-manager-daemons 五、保存当…

CDH6.3.1安装指南

CDH安装指南&#xff01;&#xff01;&#xff01;&#xff01; CDH简介 CDH基于Web的用户界面,支持大多数Hadoop组件&#xff0c;包括HDFS、MapReduce、Hive、Pig、 HBase、Zookeeper、Sqoop&#xff0c;简化了大数据平台的安装、使用难度。 Cloudera Manager的功能&#xff…

linux安装cdh

环境准备&#xff1a; linux版本&#xff1a;阿里云ecs&#xff0c;Red Hat 4.8.5&#xff0c;四台机器&#xff08;一台主节点&#xff0c;三台从节点&#xff09; cdh版本&#xff1a;cdh-6.1.0-install-soft.tar.gz&#xff0c;离线安装 java版本&#xff1a; jdk1.8.0_18…

ClouderaCDH安装配置说明

实验环境 实验环境&#xff1a;Win7下vmware虚拟机 操作系统&#xff1a;CentOS 6.5 x64 Clouder Manager&#xff1a;5.14.0 CDH&#xff1a;5.14.0 安装说明 官方共给出了3中安装方式&#xff1a;第一种方法必须要求所有机器都能连网&#xff0c;由于最近各种国外的网站被…

CDH 6系列(CDH 6.0.0、CDH 6.1.0、CDH 6.2.0等)安装和使用

日萌社 人工智能AI&#xff1a;Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战&#xff08;不定时更新&#xff09; CDH 6系列&#xff08;CDH 6.0.0、CDH 6.1.0、CDH 6.2.0等&#xff09;安装和使用 CDH5&#xff08;CDH 5.16.1&#xff09;安装 CDH 6系列&am…