首页 > 代码库 > 多线程系列(1)多线程基础和Thread
多线程系列(1)多线程基础和Thread
因为现项目中有用到多线程和并发的知识,所以打算近期补习一下多线程相关的内容。第一篇文章从最基础的开始,就是如何开启一个线程,如何启动线程和阻塞线程等,这篇文章分以下几点进行总结。
- 多线程初印象
- 多线程的使用场景
- 线程的启动,挂起和终止
- 一个简单的多线程实例
多线程初印象
首先通过一张图来了解一下进程Process,应用程序域AppDomain和线程Thread之间的关系。
从图中可以总结出以下几点:
- 一个进程Process可能包含多个应用程序域,也包含多个线程,线程也可以穿梭于多个应用程序域当中,但在同一时刻,线程只会处在一个应用程序域中。
- 线程是进程的最基本的执行单元,在进程入口执行的第一个线程被视为这个进程的主线程。在.net程序中,都是以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。
多线程的使用场景
总结起来主要有以下几个场景:
- 一些特别耗时的操作。比如备份数据库,使用多线程可以提高效率。
- 处理并发任务。比如有两个任务taskA和taskB要同时处理,单个线程只能串行处理,先做完taskA然后才能做taskB。使用多线程可以同时处理这两个任务。
- 定期执行一些特殊任务。比如定期更新配置文件,监控和任务调度等场景。
线程的启动,挂起和终止
.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,欢迎大家继续关注。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。