C# 支持多线程并行执行程序 1.一个程序由一个单线程开始,该单线程由CLR和操作系统创建而成,并具有多线程创建额外线程的功能. 2.创建线程的方法 2.1 通过Thread类来创建线程. ThreadStart委托创建线程 ThreadStart ts=new ThreadStart(Run);//创建指定线程从哪里(哪个方法)开始的委托 Thread th=new Thread(ts);//传入指定的委托,创建线程实例 th.Start();//开始线程 2.2 通过C#语法糖来创建线程,直接给Thread类传递方法,这个方法只要符合ThreadStart委托所定义的方法格式,这个方法自动被编译器编译成ThreadStart委托. Thread th=new Thread(Run); th.Start(); 2.3 通过匿名委托的方式创建线程. Thread t = new Thread (delegate() { Console.WriteLine ("Hello!"); }); t.Start(); 3.创建线程前需要注意 3.1 在调用Start()之后,直到线程结束之前,线程的一个IsAlive属性一直未true, 3.2 一个线程一旦结束,便不能重新开始. 4.使用排他锁(locker)解决线程安全问题 在多线程编程中,会有多个线程并发调用同一个代码块A的情况,用来提升代码的执行效率. 同一时间段,只有一个线程执行代码块B,lock能确保代码块B完成运行的同时,不被其他线程所干扰或中断.lock把一段代码定义为互斥段,互斥段在一个时刻内只允许一个线程进入,其他线程必须等待. static void Go() { lock (locker) { if (!done) { Console.Write("done"); done = true; } }} 4.1 当lock内语句为值类型而不是引用类型时,则会报编译错误, 4.2 常用的引用类型有: 类, 接口, 委托, 字符串, object, 数组,使用lock同步时,要保证lock是同一对象,方法是new 一个Object,并且永不修改他。 static Object locker = new Object(); static void Write() { while (true) { lock (locker) { donationNums += 100; Console.WriteLine("当前有人正在捐款......请稍等"); Thread.Sleep(3000); Console.WriteLine("到目前为止,共募捐{0}元", donationNums); } } } 5.使用Join方法,阻塞调用线程,直到子程序终止或者到一定时间为止, 主线程执行子线程数组,子线程数组在Join()方法的影响下,子线程数组中的线程不会并发全部执行,而是一个个依次执行, 6.通过ParameterizedThreadStart委托给线程调用的方法传递参数来区分线程 6.1 ThreadStart只能接收无参数返回值的方法, ParameterizedThreadStart pt = new ParameterizedThreadStart(Run); //ParameterizedThreadStart接收一个方法(该方法无返回值,接收一个Object作为参数) Thread th = new Thread(pt); th.Start(true); Run(false); //传递参数