首页 > 代码库 > 多线程系列(1)多线程基础和Thread

多线程系列(1)多线程基础和Thread

  因为现项目中有用到多线程和并发的知识,所以打算近期补习一下多线程相关的内容。第一篇文章从最基础的开始,就是如何开启一个线程,如何启动线程和阻塞线程等,这篇文章分以下几点进行总结。

  1. 多线程初印象
  2. 多线程的使用场景
  3. 线程的启动,挂起和终止
  4. 一个简单的多线程实例

多线程初印象

  首先通过一张图来了解一下进程Process,应用程序域AppDomain和线程Thread之间的关系。

从图中可以总结出以下几点:

  1. 一个进程Process可能包含多个应用程序域,也包含多个线程,线程也可以穿梭于多个应用程序域当中,但在同一时刻,线程只会处在一个应用程序域中。
  2. 线程是进程的最基本的执行单元,在进程入口执行的第一个线程被视为这个进程的主线程。在.net程序中,都是以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。

多线程的使用场景

  总结起来主要有以下几个场景:

  1. 一些特别耗时的操作。比如备份数据库,使用多线程可以提高效率。
  2. 处理并发任务。比如有两个任务taskA和taskB要同时处理,单个线程只能串行处理,先做完taskA然后才能做taskB。使用多线程可以同时处理这两个任务。
  3. 定期执行一些特殊任务。比如定期更新配置文件,监控和任务调度等场景。

线程的启动,挂起和终止

  .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,欢迎大家继续关注。