什么是多线程

基本概念线程
被定义为程序的执行路径,也叫执行单元线程是轻量级进程;使用线程节省了 cpu 周期的浪费,同时提高了应用程序的效率进程
是windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程一个进程可以包括一个或多个线程, 注:至少得有一个线程进程之间是相对独立的,一个进程无法访问另一个进程的数据查看当前系统中的进程
打开任务管理器,查看当前运行的进程
编辑
查看当前系统中的线程在任务管理器里面查询当前总共运行的线程数
编辑
并行与串行(异步与同步)并行(异步): 多个线程同时执行任务举例:小明在烧开水的同时去洗菜了串行(同步): 一个任务执行完后才能执行下一个举例:小明在烧开水,等开水烧开后再去洗菜线程的生命周期新建 :当线程实例被创建但 start 方法未被调用时的状况就绪 :当线程准备好运行并等待 cpu 调度不可运行 :下面的几种情况下线程是不可运行的:已经调用 sleep 方法已经调用 wait 方法通过 i/o 操作阻塞死亡状态 :当线程已完成执行或已中止时的状况主线程一个进程可以包含若干个线程,在进程入口执行的 第一个线程被视为这个进程的主线程 。在 c# 中,都是以main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。在 c# 中,system.threading.thread 类用于线程的工作。它允许创建并访问多线程应用程序中的单个线程可以使用 thread 类的 currentthread 属性访问线程。举例:主线程执行
internal class threadtest{ static void main(string[] args) { thread th = thread.currentthread; th.name = mainthread; console.writeline(线程id是:{0},线程名称是:{1}, th.managedthreadid, th.name); }}输出结果
线程id是:1,线程名称是:mainthread**多线程的创建与管理 **创建线程是通过扩展 thread 类创建的,然后在构造方法中传入委托对象。扩展的 thread 类调用 start() 方法来开始子线程的执行**子线程不需要传参使用 **threadstartinternal class threadtest{ static void main(string[] args) { // 创建两个子线程 thread t1 = new thread(new threadstart(printstr)); thread t2 = new thread(new threadstart(printstr)); t1.start(); t2.start(); } private static void printstr() { thread th = thread.currentthread; console.writeline(线程id是:{0}, th.managedthreadid); }}输出结果
线程id是:7线程id是:6通过threadstart 源码,可以看到它其实是一个委托
编辑
如果要向子线程中传递参数则需要使用: parameterizedthreadstart注意:parameterizedthreadstart委托的参数类型必须是object的internal class threadtest{ static void main(string[] args) { // 创建两个子线程 thread t1 = new thread(new parameterizedthreadstart(printstrparam)); thread t2 = new thread(new parameterizedthreadstart(printstrparam)); t1.start(我是有参数1); t2.start(我是有参数2); } private static void printstrparam(object obj) { thread th = thread.currentthread; console.writeline(线程id是:{0},参数是:{1}, th.managedthreadid,obj); }}输出结果
线程id是:6,参数是:我是有参数1线程id是:7,参数是:我是有参数2线程的管理与销毁thread 类提供了各种管理线程的方法,下面演示sleep() 方法的使用,用于在一个特定的时间暂停线程abort() 方法用于销毁线程;通过抛出 threadabortexception 在运行时中止线程。这个异常不能被捕获,如果有 finally 块,控制会被送至 finally 块。 注:这个方法被标记过时了,虽然依旧可以使用,但推荐使用 cancellationtoken 来代替internal class threadtest{ static void main(string[] args) { // 创建两个子线程 thread t1 = new thread(new threadstart(printsleep)); t1.start(); // 主线程睡眠 1 秒 thread.sleep(1000); // 销毁线程 try { t1.abort(); } catch (threadabortexception e) { console.writeline(进catch了吗???); } finally { console.writeline(进finally了吗???); } } private static void printsleep() { for (int i = 0; i 0) { thread.sleep(100); num--; console.writeline(卖出一部手机,还剩下 {0} 个,num); } else { console.writeline(卖完了....); } }}输出结果
卖出一部手机,还剩下 0 个卖出一部手机,还剩下 -1 个**加锁后案例
**
internal class threadtest{ static void main(string[] args) { phonesale phone=new phonesale(); // 创建两个子线程 thread t1 = new thread(new threadstart(phone.salephone)); thread t2 = new thread(new threadstart(phone.salephone)); t1.start(); t2.start(); }}public class phonesale{ // 数量 private int num = 1; public void salephone() { lock (this) { if (num > 0) { thread.sleep(100); num--; console.writeline(卖出一部手机,还剩下 {0} 个, num); } else { console.writeline(卖完了....); } } }}输出结果
卖出一部手机,还剩下 0 个卖完了....多线程的优缺点优点可以同时完成多个任务,使程序的响应速度更快多线程技术解决了多部分代码同时执行的需求,能够更好的利用cpu的资源可以设置每个任务的优先级以优化程序性能缺点线程需要占用内存,线程越多,占用内存也越多多线程需要协调和管理,所以需要占用cpu时间以便跟踪线程线程之间对共享资源的访问会相互影响,必须解决争用共享资源的问题线程太多会导致控制太复杂为什么程序可以多线程执行呢? 程序中的多线程与cpu的多线程有什么关系?
目前电脑都是多核多cpu的,一个cpu在同一时刻只能运行一个线程,但是多个cpu在同一时刻就可以运行多个线程。
线程的最大并行数量上限是cpu核心的数量,但是,往往电脑运行的线程的数量远大于cpu核心的数量,所以 还是需要cpu时间片的切换
cpu运行速度太快,硬件处理速度跟不上,所以操作系统进行分 ** 时间片
管理** 。这样,从宏观角度来说是多线程并发的,因为cpu速度太快,察觉不到,看起来是同一时刻执行了不同的操作

工程师认识工程和解决问题的一些思路
智能电视的开机广告你厌烦吗
3D重建的SLAM方案算法解析
黑莓 Ghost/Ghost Pro 曝光 预计只在印度发售
TRINAMIC推出智能马达解决方案
什么是多线程
有关USB2.0的常见问题
小冰自由式滑雪空中技巧视觉评分系统 人工智能在竞技类体育领域首个落地成果
今年手机屏幕营收将首次超越电视屏幕
一文详解buck的电路设计
电机引线线束焊接机的特点
MAX2550-MAX2553收发器Femtocell无线参考设计
5G手机渗透率在节节攀升,推动零部件采购量的大幅提升
常用数控加工计算公式和最全螺纹标准
5G车载网关让医院无人配送车“灵活”起来
超宽带 (UWB) 如何助力打造智能工厂?后面四个落地案例值得参考
从fan-in、fan-out看setup和hold time violation
Linux 内核数据结构:位图(Bitmap)
AG9311MAQ扩展成本低性价比高的Type-C
Reference Design for a High-Cu