C# 多线程开发 1:使用 Thread 类创建与启动线程
2014-02-27 22:29
2211 查看
C# 多线程开发 1:使用 Thread 类创建与启动线程
三五月儿 于 星期日, 08/12/2013 - 23:40 提交C#中,可以使用Thread类来处理(包含创建,启动,挂起,恢复,终止等操作)线程。本文将介绍如何使用Thread类来创建与启动新线程。
Thread类类位于System.Threading命名空间中。
1、线程创建与启动
实例化一个Thread对象,就创建了一个新的线程。
线程创建后调用Start()方法便可以启动新线程。
下面给出一个使用Thread类创建和启动新线程的实例。
文章一开始,给出实例的完整代码,如下:
[csharp] view plaincopy
//完整的示例代码
//求和方法
static void CalcSum()
{
long sum = 0;
for (long i = 0; i < 1000000000; i++)
{
sum += i;
if (i % 100000000 == 0 && i!=0)
{
Console.WriteLine("workThread-->i={0}:sum={1}",i,sum);
}
}
}
//求差方法
static void CalcGap()
{
long gap = 0;
for (long i = 1000000000; i >=0 ; i--)
{
gap = i-1;
if (i % 100000000 == 0 && i != 0)
{
Console.WriteLine("MainThread-->i={0}:gap={1}", i, gap);
}
}
}
static void Main(string[] args)
{
ThreadStart entry = new ThreadStart(CalcSum);//求和方法被定义为工作线程入口
Thread workThread = new Thread(entry);
workThread.Start();
CalcGap();//求差方法被主线程调用
}
在实例中,定义了两个方法,一个求和方法(CalcSum)和一个求差方法(CalcGap)。
求差方法在Main函数中被调用,这个很容易被看出,不做过多解释。
那么实例中的求和方法被谁调用了呢?回答这个问题前,我们需要对Thread类的实例化操作做个简单的说明。
Thread类在实例化时,需要给其构造函数传入一个参数,用于指定线程开始执行的方法(线程入口)。我们查看Thread类的定义,发现其构造函数有以下重载形式:
在这里,我们使用下面这个构造函数来实例化Thread对象(其他构造函数的使用会在后续博文中介绍):
[csharp] view plaincopy
public Thread(ThreadStart start);
该构造函数接受一个ThreadStart 类型的入参。
查看ThreadStart 类型的定义,如下:
[csharp] view plaincopy
public delegate void ThreadStart();
通过阅读定义,我们了解到,ThreadStart是一个委托类型,该委托类型封装的方法没有入参也没有返回值。
ThreadStart委托类型的定义同样位于System.Threading命名空间中。
到这里,我们可以简单总结一下Thread对象的实例化过程,包含以下步骤:
定义一个包含了要执行代码的方法,同时该方法必须具有和ThreadStart委托类型相同的签名(没有入参也没有返回值);
创建ThreadStart委托类型的委托实例;
实例化Thread对象,且将ThreadStart的委托实例作为入参传入Thread类的构造函数。
在本例中的求和方法与 ThreadStart委托类型具有相同的签名,且包含线程需要执行的操作,所以用它来创建ThreadStart委托的委托实例。
再将ThreadStart委托实例作为参数传入Thread构造函数实例化Thread对象。这样就可以告诉编译器线程入口为求和方法CalcSum()。一旦启动线程就会执行这个求和方法指定的操作序列。
实例化Thread对象代码如下:
[csharp] view plaincopy
ThreadStart entry = new ThreadStart(CalcSum);
Thread workThread = new Thread(entry);
static void CalcSum()
{
//do what you want
}
Thread类型的实例化也可以使用下面的形式来完成:
[csharp] view plaincopy
Thread workThread = new Thread(new ThreadStart(CalcSum));
本例中,传送给Thread类型构造函数的参数是ThreadStart类型的委托。其实,我们也可以采用匿名方法来完成前面Thread类的实例化操作,具体代码如下:
[html] view plaincopy
Thread workThread = new Thread(delegate()
{
long sum = 0;
for (long i = 0; i < 1000000000; i++)
{
sum += i;
if (i % 100000000 == 0 && i != 0)
{
Console.WriteLine("workThread-->i={0}:sum={1}", i, sum);
}
}
});
或者:
[csharp] view plaincopy
Thread workThread = new Thread(delegate()
{
CalcSum();
});
接下来,启动线程,代码如下:
[csharp] view plaincopy
workThread.Start();
代码中的求差方法被Main函数调用,在主线程中被执行。
而求和方法作为工作线程workThread的入口,被工作线程调用。
这里给出两个方法主要是为了说明,此时确实存在两个线程在执行。
至于代码其他细节,这里不做过多解释,有兴趣的可以一探究竟,执行结果如下所示。
相关文章推荐
- C# 多线程编程 - 使用Thread类创建线程
- C#多线程开发1:使用Thread类创建与启动线程
- 【iOS开发-多线程】使用NSOperation创建线程(使用较多)
- C#基础:使用Thread创建线程
- [非技术参考]C#基础:使用Thread创建线程(1)
- C#基础:使用Thread创建线程
- 多线程开发要点1:如何使用类的成员函数创建线程
- [C#学习笔记之多线程1]使用ParameterizedThreadStart委托向线程函数传送参数
- C#中的多线程使用 -- Thread 类: 使用回调函数从一个线程中检索数据
- java多线程编程之使用thread类创建线程
- C#中的多线程使用 -- Thread 类: 使用回调函数从一个线程中检索数据
- iOS开发之多线程(NSThread创建线程)
- C#中的多线程使用 -- Thread 类: 使用回调函数从一个线程中检索数据
- Java多线程-(4)线程的创建、启动、Runnable和Thread
- C# ThreadPool 自定义线程管理池 实现多线程池管理 有助与开发多线程系统的线程运行情况监控。
- c#中使用多线程访问winform中控件的若干问题 解决线程间操作无效: 从不是创建控件的线程访问它
- Java中使用Thread创建多线程并启动
- C# 多线程编程 - 使用委托创建线程
- 多线程Thread与后台线程setDaemon,使用Runnable接口创建多线程
- python 8-1 如何使用多线程,Thread创建线程,执行函数赋值给target//类+函数放在run方法中执行