为什么会有线程,为了进程的稳定,一个进程死掉了,不能影响到其他进程, 而为什么会有进程,为了操作系统的稳定,不能在操作系统上操作一个记事本就把整个系统给搞崩溃了; 线程是进程的逻辑单元,多个线程存在共用一个CPU的情况,会出现资源竞争, 为了保证数据不错乱,要对线程进行调度,每隔30毫秒进行一次切换,当然切换的过程存在性能磨损,也是为了用户体验和系统的可靠性牺牲一点性能,在我们多核时代这一点性能其实也是可以忽略的; 线程实现,Net 中关键字 Thread , 分前台线程和后台线程,通过IsBackgournd来标记,一般我们都使用后台线程即异步,线程分优先级去处理,在调度过程中优先级高的优先处理, Net 中提供了比较丰富的线程API,比如Sleep,Join,Abort 就不再一一赘述了, 线程池是为了解决线程来回切换损失的性能,它的主要作用就是 线程复用,当一个线程处理完成任务后重新回到线程池中,等待下次再用,有时我们异步处理数据时为了提高性能,对数据进行分组,然后分别放在不同的线程中去处理, 比如 一个线程池中有5个线程,一批数据有 1000 条,则每一个线程处理200 条,当然可能会出现不整除的情况,(取模), 当线程处理完成后重新回到池中等待下一个任务,线程池也有不足比如无法实时查看线程进度,不能反馈执行结果, 這样Task 就出现了,Task 是在线程池的基础上进行了封装,优化, Net 同样也提供了丰富的API ,比如 Run, StartFactory, Wait,WaitAll,ContinueWith 等;
定义就不多说了,直接上代码
1 /// <summary> 2 /// 单线程应用 3 /// </summary> 4 class Program 5 { 6 static void Main(string[] args) 7 { 8 Console.WriteLine("进入主线程"); 9 User u = new User("小刚"); 10 u.Getshow(); 11 Console.WriteLine("主线程结束"); 12 } 13 } 14 public class User 15 { 16 private string name; 17 public User(string name) 18 { 19 this.name = name; 20 } 21 public void Getshow() 22 { 23 Console.WriteLine("Name=>" + name); 24 } 25 }