转载

[.net 面向对象程序设计进阶] (16) 多线程(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();

运行结果如下:

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

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();     

以下是运行结果:

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

7. 本节要点:

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

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

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

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

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

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

返回目录

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

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

.NET 技术交流群:467189533 [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 使用多线程提高程序性能

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

正文到此结束
Loading...