C# 支持多线程

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); //传递参数

 

posted @ 2019-06-25 17:13  enych  阅读(568)  评论(0编辑  收藏  举报