你的位置:首页 > ASP.net教程

[ASP.net教程][.net面向对象程序设计进阶]多线程(Multithreading)(一) 使用多线程提高程序性能


[.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 使用多线程提高程序性能 

本节导读: 

多线程(Multithreading)使我们程序可以同时进行多任务处理,直接提高了程序的执行效率,学习多线程对提高程序运行能力非常必要,本节主要介绍多线程原理及.NET中多线程的应用。

1. 关于多线程 

在介绍多线程之前,先了解一下进程。 

进程:独立运行的程序称为进程。(比如Windows系统后台程序,也可以称为后台进程) 

线程:对于同一个程序分为多个执行流,称为线程。 

多线程:使用多个线程进行多任务处理,称为多线程。 

2. 如何合理使用多线程? 

A.对于用户等待程序处理时,可以使用多线程处理耗时任务; 

B.对于一些不需要即时完成的任务,可以使用后台任务线程处理; 

C.对于多并发任务,可以使用多线程同时处理;

D.对于通讯类,比如对线程阻塞,可以使用多线程。 

除过上面的几个常用的情况,还有很多情况下可以使用多线程。 

3. 多线程的缺点
线程自然也有缺点,以下列出了一些:
A.如果有大量的线程,会影响性能,因为操作系统需要在他们之间切换;
B.更多的线程需要更多的内存空间;
C.线程会给程序带来更多的bug,因此要小心使用,比如:线程任务在执行完成后,要及时释放内存; 
D.线程的中止需要考虑其对程序运行的影响。 

4. .NET中的两种多线程 

.NET本身就是一个多线程的的环境。 

在.NET中有两种多线程的: 

一种是使用Thread 类 进行线程的创建、启动,终止等操作。 

一种是使用ThreadPool 类 用于管理线程池. 

5. .NET中使用Thread 进行多线程处理 

.NET 基础类库的System.Threading命名空间提供了大量的类和接口支持多线程。System.Threading.Thread类是创建并控制线程,设置其优先级并获取其状态最为常用的类。

下面是该类几个至关重要的方法:
Thread.Start():启动线程的执行;
Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;
Thread.Resume():继续已挂起的线程;
Thread.Interrupt():中止处于 Wait或者Sleep或者Join 线程状态的线程;
Thread.Join():阻塞调用线程,直到某个线程终止时为止
Thread.Sleep():将当前线程阻塞指定的毫秒数;
Thread.Abort():以开始终止此线程的过程。如果线程已经在终止,则不能通过Thread.Start()来启动线程。 

6. 多线程示例 

6.1 简单的线程 

创建线程调用方法:

/// <summary>/// 线程方法/// </summary>static void MyThread(){  int i = 0;  while(true){    Console.WriteLine("我是一个线程方法"+ (++i));  };      }

创建并启用线程:

//创建线程ThreadStart threadStart = new ThreadStart(MyThread);Thread thread = new Thread(threadStart);thread.Start();Thread.Sleep(5000);thread.Abort();

运行结果如下: 

  

6.2 多线程示例 

下面还是使用比较熟悉的“武林高手”的例子,来实现两个高手各自独立的线程下战斗。 

(说明:此实例主要是说明多线程的独立运行,重点并不是战斗过程。对于战斗过程,我们可以根据杀伤力让两个高手分别出招,可以想一下实现方法) 

先定义“武林”类来实现武功和武林高手及战斗的方法

/// <summary>/// 武林/// </summary>public class MartialArts{  /// <summary>  /// 大侠姓名  /// </summary>  private string name;       private List<MartialArtsMaster> masterList;  /// <summary>  /// 战斗  /// </summary>  /// <param name="name"></param>        public MartialArts(string _name,List<MartialArtsMaster> _list)  {    name = _name;           masterList = _list;  }  public void Fight()  {    Kongfu kongfu = new Kongfu();    masterList.Where(mm => mm.name == name).First().kongFu.ForEach(      m => Console.WriteLine("时间:"+System.DateTime.Now+" "+name + "出招:" + m.kongfuName + " 杀伤力:" + m.lethality)    );                 }  /// <summary>  /// 类:武林高手  /// MartialArtsMaster  /// </summary>  public class MartialArtsMaster  {    /// <summary>    /// 编号    /// </summary>    public int id { get; set; }    /// <summary>    /// 姓名    /// </summary>    public string name { get; set; }    /// <summary>    /// 年龄    /// </summary>    public int age { get; set; }    /// <summary>    /// 门派    /// </summary>    public string menpai { get; set; }    /// <summary>    /// 武学    /// </summary>    public List<Kongfu> kongFu { get; set; }    /// <summary>    /// 级别    /// </summary>    public int level { get; set; }  }  /// <summary>  /// 类:武学  /// Kongfu  /// </summary>  public class Kongfu  {    /// <summary>    /// 武学名称    /// </summary>    public string kongfuName { get; set; }    /// <summary>    /// 杀伤力    /// </summary>    public int lethality { get; set; }  }}

实例两个武林高手和他们所学武功:

//增加几个武林高手List<MartialArts.MartialArtsMaster> masterList=new List<MartialArts.MartialArtsMaster>();masterList.Add(new MartialArts.MartialArtsMaster(){  id = 1,  name = "令狐冲",  age = 23,  menpai = "华山",  kongFu = new List<MartialArts.Kongfu>() {    new MartialArts.Kongfu() { kongfuName = "江湖-预备式", lethality = 29 },    new MartialArts.Kongfu() { kongfuName = "紫霞功-预备式", lethality = 75 },    new MartialArts.Kongfu() { kongfuName = "紫霞功-龙旋法", lethality = 78 },    new MartialArts.Kongfu() { kongfuName = "紫霞功-无极桩", lethality = 80 },     new MartialArts.Kongfu() { kongfuName = "紫霞功-推山功", lethality = 82 },    new MartialArts.Kongfu() { kongfuName = "吸星大法-融功", lethality = 88 },    new MartialArts.Kongfu() { kongfuName = "独孤九剑-破剑式", lethality = 90 },    new MartialArts.Kongfu() { kongfuName = "独孤九剑-破刀式", lethality = 94 },    new MartialArts.Kongfu() { kongfuName = "独孤九剑-破掌式", lethality = 96 },    new MartialArts.Kongfu() { kongfuName = "独孤九剑-总决式", lethality = 98 },        new MartialArts.Kongfu() { kongfuName = "独孤九剑-易筋经", lethality = 100 }   },  level = 10});masterList.Add(new MartialArts.MartialArtsMaster(){  id = 2,  name = "岳不群",  age = 55,  menpai = "桃花岛",  kongFu = new List<MartialArts.Kongfu>() {    new MartialArts.Kongfu() { kongfuName = "江湖-预备式", lethality = 30 },    new MartialArts.Kongfu() { kongfuName = "紫霞功-摩云手", lethality = 76 },    new MartialArts.Kongfu() { kongfuName = "紫霞功-拍打功", lethality = 79 },    new MartialArts.Kongfu() { kongfuName = "紫霞功-震丹田", lethality = 81 },     new MartialArts.Kongfu() { kongfuName = "紫霞功-哈丹田", lethality = 83 },    new MartialArts.Kongfu() { kongfuName = "紫霞功-神光旋绕", lethality = 89 },    new MartialArts.Kongfu() { kongfuName = "紫霞功-神光旋绕", lethality = 89 },    new MartialArts.Kongfu() { kongfuName = "葵花宝典-第一重-六合-拇指取针", lethality = 91 },    new MartialArts.Kongfu() { kongfuName = "葵花宝典-第三重-随风-起针", lethality = 95 },    new MartialArts.Kongfu() { kongfuName = "葵花宝典-第五重-依云-无名针法", lethality = 97 },    new MartialArts.Kongfu() { kongfuName = "葵花宝典-第七重-空蝉-兰花指", lethality = 99 },  },  level = 10});

调用两个线程让两个武林高手各自出招

//线程开始//令狐冲 战斗 线程    MartialArts LingMartialArts = new MartialArts("令狐冲", masterList);Thread LingThread = new Thread(LingMartialArts.Fight);     //岳不群 战斗 线程MartialArts YueMartialArts = new MartialArts("岳不群", masterList);Thread YueThread = new Thread(YueMartialArts.Fight);YueThread.Start();LingThread.Start();  

以下是运行结果: 

 

 7. 本节要点:

A.介绍了进程和线程的关系 

B.介绍了多线程的几种适用环境 

C.介绍了多线程的几种缺点,也是要注意的几点 

D.介绍了.NET中的两种多线程 

E.重点介绍了NET中使用Thread 进行多线程处理

==============================================================================================  

 返回目录

 <如果对你有帮助,记得点一下推荐哦,如有有不明白或错误之处,请多交流>  

<转载声明:技术需要共享精神,欢迎转载本博客中的文章,但请注明版权及URL>

.NET 技术交流群:467189533    .NET 程序设计

==============================================================================================