因为现项目中有用到多线程和并发的知识,所以打算近期补习一下多线程相关的内容。第一篇文章从最基础的开始,就是如何开启一个线程,如何启动线程和阻塞线程等,这篇文章分以下几点进行总结。
首先通过一张图来了解一下进程Process,应用程序域AppDomain和线程Thread之间的关系。
从图中可以总结出以下几点:
总结起来主要有以下几个场景:
.net framework为我们提供了Thread类来使用多线程,它在命名空间System.Threading下。
开启线程:创建一个Thread对象,它分为无参类ThreadStart,有参类ParameterizedThreadStart,传入参数为Object类型。
前台线程和后台线程:使用Thread.Start()方法启动的线程默认为前台线程,一般我们将新启动的线程设置为后台线程,因为这样我们的主线程就不需要等待前台线程执行完成。
挂起线程:使用Thread.Sleep()方法可将主线程挂起,但是系统无法预计异步线程(新开启的线程)的运行时间,所以使用Sleep()方法来阻塞主线程并不科学。通常我们使用异步线程的Join()方法来保证主线程在异步线程运行结束后才结束。
终止线程:使用Thread.Abort()方法。
下面使用一个简单的示例来演示如何使用简单的多线程,示例代码如下。
namespace ThreadDemo { class Program { static void Main(string[] args) { // Thread Fish fish = new Fish() { Name="小黄鱼" }; Thread thread1 = new Thread(() => { fish.Move(); }); thread1.IsBackground = true; thread1.Start(); Fish fish2 = new Fish { Name = "大鲨鱼" }; Thread thread2 = new Thread(() => { fish2.Move(); }); thread2.IsBackground = true; thread2.Start(); Console.ReadKey(); } } /// <summary> /// 鱼 /// </summary> public class Fish { public string Name { get; set; } public int Score { get; set; } public Fish() { } public void Move() { Console.WriteLine(string.Format("{0}在游来游去...", Name)); } } }
程序运行的结果为:
下一篇文章我将总结如何使用线程池ThreadPool,欢迎大家继续关注。