[.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 使用多线程提高程序性能
多线程(Multithreading)使我们程序可以同时进行多任务处理,直接提高了程序的执行效率,学习多线程对提高程序运行能力非常必要,本节主要介绍多线程原理及.NET中多线程的应用。
在介绍多线程之前,先了解一下进程。
进程:独立运行的程序称为进程。(比如Windows系统后台程序,也可以称为后台进程)
A.对于用户等待程序处理时,可以使用多线程处理耗时任务;
B.对于一些不需要即时完成的任务,可以使用后台任务线程处理;
C.对于多并发任务,可以使用多线程同时处理;
D.对于通讯类,比如对线程阻塞,可以使用多线程。
除过上面的几个常用的情况,还有很多情况下可以使用多线程。
3. 多线程的缺点
线程自然也有缺点,以下列出了一些:
A.如果有大量的线程,会影响性能,因为操作系统需要在他们之间切换;
B.更多的线程需要更多的内存空间;
C.线程会给程序带来更多的 bug ,因此要小心使用 ,比如:线程任务在执行完成后,要及时释放内存;
D.线程的中止需要考虑其对程序运行的影响。
.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 ()来启动线程。
创建线程调用方法:
/// <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();
以下是运行结果:
A.介绍了进程和线程的关系
B.介绍了多线程的几种适用环境
C.介绍了多线程的几种缺点,也是要注意的几点
D.介绍了.NET中的两种多线程
E.重点介绍了NET中使用Thread 进行多线程处理
==============================================================================================
<如果对你有帮助,记得点一下 推荐 哦,如有 有不明白或错误 之处 ,请多交流>
<转载声明:技术需要共享精神,欢迎转载本博客中的文章,但请注明版权及URL>
.NET 技术交流群:467189533
==============================================================================================