C# 线程及使用

1. 进程和线程概念: 

        进程(process):  应用程序的实例要使用的资源的集合。每个进程被赋予了一个虚拟地址空间,确保在一个进程中使用的代码和数据无法由另一个进程访问。

        线程(thread): 线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针,程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

2. 创建线程的目的是什么?

        是为了建立程序单独的执行路径,让多部分代码实现同时执行----并发执行。

3. C# 线程:

       线程是使用Thread类处理的,使用Thread类创建线程时,只需要提供线程入口,线程入口告诉程序让这个线程做什么(即提供一个方法)。通过Thread类可以控制当前应用程序域中线程的创建、挂起、停止、销毁。

     a. Thread类 一些常用属性:

             

      b.Thread 的优先级:

            

4.  前台线程与后台线程:

        .Net的公用语言运行时(CLR)能区分这两种不同类型的线程,这两者区别是:应用程序必须运行完所有的前台线程才可以退出,而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。
         在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止,一般后台线程用于处理时间较短的任务。

class Program
{
	static void Main(string[] args)
	{
		Console.WriteLine("hello world!");
		Thread thread = new Thread(Worker);
		thread.Start();
		thread.IsBackground = true;  //设置这个线程为后台线程
		Console.WriteLine("从主线程退出");
		//Console.ReadKey();
	}
	static void Worker()
	{
		Thread.Sleep(1000);
		Console.WriteLine("后台线程退出");
	}
}

5. 创建多线程的步骤:

    1. 编写线程所要执行的方法。
    2. 实例化Thread类,并传入一个指向线程所要执行的方法(委托)。(这时线程已经产生,但还没有运行)
    3. 调用Thread 实例的Start方法,标记该线程可以被CPU执行了, 但具体执行时间由CPU决定。

 thread.join(); //执行这条语句的线程(主线程)等thread线程执行完毕,然后才往下执行
 thread.Abort();// 不得已情况下才使用,直接终结线程。正常退出线程时对应的方法执行完毕,调用Abort()直接中断停止。

6. 构造无参数线程和有参数线程: 

     a. 创建无参数无返回值的线程,需要使用ThreadStart类型: 

static void Main(string[] args) 
{
   Thread thread = new Thread(new ThreadStart(Worker1)); //Worker为无参数的方法,直接传入相应的无参无返回值方法——语法糖(允许这种简写方式,运行时编译器会自动加上)Thread thread1 = new Thread(Thread1);
   thread.Start(); //给Worker方法传递的参数
}	
static void Worker1() 
{
	Thread.Sleep(1000);
	Console.WriteLine("这是无参的方法 ");
}

      b. 创建有参数无返回值的线程,需要使用ParameterizedThreadStart类型: 

static void Main(string[] args) 
{	
	Thread thread = new Thread(new ParameterizedThreadStart(Worker2)); //Worker为带参数的方法
	thread.Start("abc"); //给Worker方法传递的参数
}
	
static void Worker2(object data) 
{
	Thread.Sleep(1000);
	Console.WriteLine("传入的参数是 " + data.toString());
}

 

7. 运行通过匿名方法和Lambada表达式创建线程方法:

static void Main(string[] args)
{
	//通过匿名委托创建
	Thread thread1 = new Thread(delegate () { Console.WriteLine("我通过匿名方法创建的方法"); });
	thread1.Start();

	//通过Lambda表达式创建
	Thread thread2 = new Thread(() => Console.WriteLine("我是通过Lambda表达式创建的方法"));
	thread2.Start();
	Console.ReadKey();
}

输出:

 

8. 使用函数Join来实现,确保主线程会在后台线程结束后才开始运行:

static void Main(string[] args)
{
	Console.WriteLine("hello world!");
	Thread thread = new Thread(Worker);
	thread.Start();
	thread.IsBackground = true;
	thread.Join();//执行这句话的线程(主线程)会等待后台线程结束之后才能继续执行
	Console.WriteLine("从主线程退出");
	//Console.ReadKey();
}
static void Worker()
{
	Thread.Sleep(1000);
	Console.WriteLine("后台线程退出");
}

      使用Join的时候,主线程会等待后台线程结束之后才能继续执行。另外Join方法还有一个参数,表示等待多长时间。如果设置了时间,等了这个时间还没执行完就不会再等了。比如这里设置为500,那么就可能等不了子线程的执行了。

 

 

本文根据徐照兴教授讲义编写,有些改动。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值