C# 多线程入门系列(二)
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。进程是资源分配的基本单位。所有与该进程有关的资源,都被记录在进程控制块PCB中。以表示该进程拥有这些资源或正在使用它们。本文以一些简单的小例子,简述多线程的发展历程【Thread,ThreadPool,Task,Parallel】,仅供学习分享使用,如有不足之处,还请指正。
Thread
为了应对Thread创建缺乏管理的问题,在后续版本【.Net Framework2.0】中推出了线程池的概念。那什么是线程池呢?
池化资源管理设计思想:线程是一种资源,之前每次需要线程,都是去创建线程,使用完成后,再释放掉。池化,就是做一个容器,容器提前申请指定数量的线程,需要用到线程的时候,直接到线程池中取,用完之后再放回容器【通过控制状态标识线程是否正在被使用】。避免频繁的创建和销毁,容器还会根据限制的数量取申请和释放。
关于通过线程池创建多线程,具体示例如下:
1 private void btnThread3_Click(object sender, EventArgs e) 2 { 3 WaitCallback waitCallback = new WaitCallback(DoSomethingLongWithParam); 4 string name = "ThreadPool"; 5 ThreadPool.QueueUserWorkItem(waitCallback,name); 6 }
线程池示例执行结果如下所示:
通过对线程池执行结果进行分析,得出结论如下:
- 两次执行结果,均为同一个线程ID,说明线程用完并未销毁,而是放回线程池子,待下次使用时重新取出,继续使用。
- 通过线程池可以有效的控制线程并发的数量,避免资源的浪费。
- 通过分析源码发现,ThreadPool线程池提供的接口较少,在线程等待和交互方面不太友好。
Task
Parallel提供对并行线程的支持,可以通过Parallel同时发起多个线程,在某些方面具有应用优势,默认示例如下所示:
1 private void btnParallel_Click(object sender, EventArgs e) 2 { 3 Action action = new Action(DoSomethingLong); 4 Parallel.Invoke(action,action,action); 5 }
Parallel的Invoke方法执行,结果如下:
通过对Parallel的Invoke示例方法进行分析,得出结论如下:
- Parallel的Invoke方法,可以同时开启多个线程,同时主线程【线程ID=1】也会参与计算,即页面也会卡住。
- Parallel可以通过ParallelOptions.MaxDegreeOfParallelism指定并发数量。
Task专讲
以上就是多线程的基础知识,旨在抛砖引玉,一起学习,共同进步。
古从军行【作者】李颀
白日登山望烽火,黄昏饮马傍交河。行人刁斗风沙暗,公主琵琶幽怨多。
野云万里无城郭,雨雪纷纷连大漠。胡雁哀鸣夜夜飞,胡儿眼泪双双落。
闻道玉门犹被遮,应将性命逐轻车。年年战骨埋荒外,空见蒲桃入汉家。
出处:https://www.cnblogs.com/hsiang/p/15690604.html