Thread线程类
时间:2011-05-03 来源:明天陪你看海
Thread类位于System.Threading命名空间下,System.Threading命名空间提供一些使得可以进行多线程编程的类和接口。除同步线程活动和访问数据的类(Mutex、Monitor、Interlocked和AutoResetEvent 等)外,该命名空间还包含一个ThreadPool类(它允许用户使用系统提供的线程池)和一个Timer类(它在线程池线程上执行回调方法)。
Thread类主要用于创建并控制线程、设置线程优先级并获取其状态。一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码,线程执行的程序代码由ThreadStart委托或ParameterizedThreadStart委托指定。
线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中。用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操作系统会接受该优先级。
Thread类的常用属性及说明如表1所示。
表1 Thread类的常用属性及说明
属性 |
说明 |
ApartmentState |
获取或设置此线程的单元状态 |
CurrentContext |
获取线程正在其中执行的当前上下文 |
CurrentThread |
获取当前正在运行的线程 |
IsAlive |
获取一个值,该值指示当前线程的执行状态 |
ManagedThreadId |
获取当前托管线程的唯一标识符 |
Name |
获取或设置线程的名称 |
Priority |
获取或设置一个值,该值指示线程的调度优先级 |
ThreadState |
获取一个值,该值包含当前线程的状态 |
Thread类的常用方法及说明如表2所示。
表2 Thread类的常用方法及说明
方法 |
说明 |
Abort |
在调用此方法的线程上引发ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程 |
GetApartmentState |
返回一个ApartmentState值,该值指示单元状态 |
GetDomain |
返回当前线程正在其中运行的当前域 |
GetDomainID |
返回唯一的应用程序域标识符 |
Interrupt |
中断处于WaitSleepJoin线程状态的线程 |
Join |
阻止调用线程,直到某个线程终止时为止 |
ResetAbort |
取消为当前线程请求的Abort |
Resume |
继续已挂起的线程 |
SetApartmentState |
在线程启动前设置其单元状态 |
Sleep |
将当前线程阻止指定的毫秒数 |
SpinWait |
导致线程等待由iterations参数定义的时间量 |
Start |
使线程被安排进行执行 |
Suspent |
挂起线程,或者如果线程已挂起,则不起作用 |
VolatileRead |
读取字段值。无论处理器的数目或处理器缓存的状态如何,该值都是由计算机的任何处理器写入的最新值 |
VolatileWrite |
立即向字段写入一个值,以使该值对计算机中的所有处理器都可见 |
例 下面演示使用Thread类的相关方法和属性,开始运行一个线程,并获得该线程的相关信息,程序开发步骤如下。
(1)新建一个Windows应用程序,命名为TestThread,默认窗体为FormTestThread.cs。
(2)在Form1窗体中添加一个RichTextBox控件,用来显示获得的线程相关信息。
(3)程序主要代码如下。
#region "窗体加载时事件"
private void FormTestThread_Load(object sender, EventArgs e)
{
string strInfo = string.Empty; //定义一个字符串,用来记录线程相关信息
Thread myThread = new Thread(new ThreadStart(threadOut)); //实例化Thread线程类对象
myThread.Start();//启动主线程
//获取线程相关信息
strInfo = "线程唯一标识符:" + myThread.ManagedThreadId;
strInfo += "\n线程名称:" + myThread.Name;
strInfo += "\n线程状态:" + myThread.ThreadState.ToString();
strInfo += "\n线程优先级:" + myThread.Priority.ToString();
strInfo += "\n是否为后台线程:" + myThread.IsBackground;
Thread.Sleep(1000); //使主线程休眠1秒钟
myThread.Abort("退出");//通过主线程阻止新开线程
myThread.Join();//等待新开的线程结束
MessageBox.Show("线程运行结束");
richTextBox1.Text = strInfo;
}
#endregion
线程开始运行时的提示信息
public void threadOut()
{
MessageBox.Show("主线程开始运行");
}
注意:在程序中使用线程时,需要在命名空间区域添加using System.Threading命名空间
运行程序,先后弹出如图1和图2所示的对话框,然后显示如图3所示主窗体,并在主窗体中显示获得的线程相关信息。
图1 线程开始运行
图2 线程运行结束
图3 主窗体