线程的生命周期
线程生命周期开始于 System.Threading.Thread类的对象被创建时,结束于线程被终止或完成执行时。
下面列出了线程生命周期中的各种状态:
未启动状态:当线程实例被创建但 Start 方法未被调用时的状况。
就绪状态:当线程准备好运行并等待 CPU 周期时的状况。
不可运行状态:下面的几种情况下线程是不可运行的:
已经调用 Sleep 方法
已经调用 Wait 方法
通过 I/O 操作阻塞
死亡状态:当线程已完成执行或已中止时的状况。
主线程
在 C# 中,System.Threading.Thread 类用于线程的工作。它允许创建并访问多线程应用程序中的单个线程。进程中第一个被执行的线程称为主线程。
当 C# 程序开始执行时,主线程自动创建。使用 Thread类创建的线程被主线程的子线程调用。您可以使用Thread 类的 CurrentThread属性访问线程。
下面的程序演示了主线程的执行:
using System; using System.Threading; namespace MultithreadingApplication { class MainThreadProgram { static void Main(string[] args) { Thread th = Thread.CurrentThread; th.Name = "MainThread"; Console.WriteLine("This is {0}", th.Name); Console.ReadKey(); } } }
Thread 类常用的属性和方法
下表列出了Thread
类的一些常用的 属性:
下表列出了 Thread 类的一些常用的 方法:
创建线程
线程是通过扩展 Thread
类创建的。扩展的 Thread
类调用 Start()
方法来开始子线程的执行。
下面的程序演示了这个概念:
using System; using System.Threading; namespace MultithreadingApplication { class ThreadCreationProgram { public static void CallToChildThread() { Console.WriteLine("Child thread starts"); } static void Main(string[] args) { ThreadStart childref = new ThreadStart(CallToChildThread); Console.WriteLine("In Main: Creating the Child thread"); Thread childThread = new Thread(childref); childThread.Start(); Console.ReadKey(); } } }
当上面的代码被编译和执行时,它会产生下列结果:
In Main: Creating the Child thread
Child thread starts
管理线程
Thread类提供了各种管理线程的方法。
下面的实例演示了 sleep()方法的使用,用于在一个特定的时间暂停线程。
void Start() { ThreadStart childref = new ThreadStart(CallToChildThread); Debug.Log("In Main: Creating the Child thread"); Thread childThread = new Thread(childref); childThread.Start(); } public static void CallToChildThread() { Debug.Log("子线程开启"); // 线程暂停 5000 毫秒 int sleepfor = 5000; Debug.Log("子线程等待 "+sleepfor / 1000+ " 秒"); Thread.Sleep(sleepfor); Debug.Log("子线程唤醒"); }
打印结果:
销毁线程
Abort()
方法用于销毁线程。
通过抛出threadabortexception
在运行时中止线程。这个异常不能被捕获,如果有finally
块,控制会被送至finally
块。
下面的程序说明了这点:
void Start() { ThreadStart childref = new ThreadStart(CallToChildThread); Debug.Log("In Main: Creating the Child thread"); Thread childThread = new Thread(childref); childThread.Start(); // 停止主线程一段时间 Thread.Sleep(2000); // 现在中止子线程 Debug.Log("In Main: Aborting the Child thread"); childThread.Abort(); } public static void CallToChildThread() { try { Debug.Log("子线程开始"); // 计数到 10 for (int counter = 0; counter <= 10; counter++) { Thread.Sleep(500); Debug.Log(counter); } Debug.Log("子线程完成"); } catch (ThreadAbortException e) { Debug.Log("线程中止异常:" + e); } finally { Debug.Log("无法捕获线程异常"); } }
打印结果:
总结
多线程还有很多使用技巧,本篇博客就作为一篇引子简单介绍一下多线程的基础用法,包括创建、暂停和销毁等
后面会进行更深入的研究,包括线程锁等等用法!