码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-18 09:30:38      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

[.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 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 使用多线程提高程序性能

标签:

原文地址:http://www.cnblogs.com/yubinfeng/p/4656001.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!