step4-多线程开发

C# 多线程开发 1:使用 Thread 类创建与启动线程

C#中,可以使用Thread类来处理(包含创建,启动,挂起,恢复,终止等操作)线程。本文将介绍如何使用Thread类来创建与启动新线程。

Thread类类位于System.Threading命名空间中。

 

1、线程创建与启动

 

实例化一个Thread对象,就创建了一个新的线程。

线程创建后调用Start()方法便可以启动新线程。

下面给出一个使用Thread类创建和启动新线程的实例。

文章一开始,给出实例的完整代码,如下:

[csharp]  view plain copy
 
  1. //完整的示例代码  
  2. //求和方法  
  3. static void CalcSum()  
  4. {  
  5.     long sum = 0;  
  6.     for (long i = 0; i < 1000000000; i++)  
  7.     {  
  8.         sum += i;  
  9.         if (i % 100000000 == 0 && i!=0)  
  10.         {  
  11.             Console.WriteLine("workThread-->i={0}:sum={1}",i,sum);  
  12.         }  
  13.     }  
  14. }  
  15.   
  16. //求差方法  
  17. static void CalcGap()  
  18. {  
  19.     long gap = 0;  
  20.     for (long i = 1000000000; i >=0 ; i--)  
  21.     {  
  22.          gap = i-1;  
  23.          if (i % 100000000 == 0 && i != 0)  
  24.          {  
  25.              Console.WriteLine("MainThread-->i={0}:gap={1}", i, gap);  
  26.          }  
  27.     }  
  28. }  
  29.   
  30. static void Main(string[] args)  
  31. {                    
  32.     ThreadStart entry = new ThreadStart(CalcSum);//求和方法被定义为工作线程入口  
  33.     Thread workThread = new Thread(entry);  
  34.     workThread.Start();  
  35.     CalcGap();//求差方法被主线程调用  
  36. }  

在实例中,定义了两个方法,一个求和方法(CalcSum)和一个求差方法(CalcGap)。

求差方法在Main函数中被调用,这个很容易被看出,不做过多解释。

那么实例中的求和方法被谁调用了呢?回答这个问题前,我们需要对Thread类的实例化操作做个简单的说明。

Thread类在实例化时,需要给其构造函数传入一个参数,用于指定线程开始执行的方法(线程入口)。我们查看Thread类的定义,发现其构造函数有以下重载形式:

在这里,我们使用下面这个构造函数来实例化Thread对象(其他构造函数的使用会在后续博文中介绍):

[csharp]  view plain copy
 
  1. public Thread(ThreadStart start);  

该构造函数接受一个ThreadStart 类型的入参。

查看ThreadStart 类型的定义,如下:

[csharp]  view plain copy
 
  1. public delegate void ThreadStart();  

通过阅读定义,我们了解到,ThreadStart是一个委托类型,该委托类型封装的方法没有入参也没有返回值。

ThreadStart委托类型的定义同样位于System.Threading命名空间中。

到这里,我们可以简单总结一下Thread对象的实例化过程,包含以下步骤:

  • 定义一个包含了要执行代码的方法,同时该方法必须具有和ThreadStart委托类型相同的签名(没有入参也没有返回值);
  • 创建ThreadStart委托类型的委托实例;
  • 实例化Thread对象,且将ThreadStart的委托实例作为入参传入Thread类的构造函数。

在本例中的求和方法与 ThreadStart委托类型具有相同的签名,且包含线程需要执行的操作,所以用它来创建ThreadStart委托的委托实例。

再将ThreadStart委托实例作为参数传入Thread构造函数实例化Thread对象。这样就可以告诉编译器线程入口为求和方法CalcSum()。一旦启动线程就会执行这个求和方法指定的操作序列。

实例化Thread对象代码如下:

[csharp]  view plain copy
 
  1. ThreadStart entry = new ThreadStart(CalcSum);  
  2. Thread workThread = new Thread(entry);  
  3. static void CalcSum()  
  4. {  
  5.     //do what you want     
  6. }  

Thread类型的实例化也可以使用下面的形式来完成:

[csharp]  view plain copy
 
  1. Thread workThread = new Thread(new ThreadStart(CalcSum));  

本例中,传送给Thread类型构造函数的参数是ThreadStart类型的委托。其实,我们也可以采用匿名方法来完成前面Thread类的实例化操作,具体代码如下:

[html]  view plain copy
 
  1. Thread workThread = new Thread(delegate()  
  2. {  
  3.     long sum = 0;  
  4.     for (long i = 0; i < 1000000000; i++)  
  5.     {  
  6.          sum += i;  
  7.          if (i % 100000000 == 0 && i != 0)  
  8.          {  
  9.               Console.WriteLine("workThread-->i={0}:sum={1}", i, sum);  
  10.          }  
  11.      }  
  12. });  

或者:

[csharp]  view plain copy
 
  1. Thread workThread = new Thread(delegate()  
  2. {  
  3.      CalcSum();  
  4. });  

接下来,启动线程,代码如下:

[csharp]  view plain copy
 
  1. workThread.Start();  

代码中的求差方法被Main函数调用,在主线程中被执行。

而求和方法作为工作线程workThread的入口,被工作线程调用。

这里给出两个方法主要是为了说明,此时确实存在两个线程在执行。

至于代码其他细节,这里不做过多解释,有兴趣的可以一探究竟,执行结果如下所示。

就到这里了,偷笑

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值