黑马程序员 -- 多线程

polk601001 星期五, 15/06/2012 - 17:14 发布

什么是多线程?

多线程就是使程序并发(同时)执行几个操作。

.NET 框架类库在System.Threading 中加入了多线程的能力。因此要在前面加入引用 using System.Threading

Thread 类:创建并控制线程,设置其优先级并获取其状态。

Thread 类的构造方法,主要有2中:Thread thread_name=

Thread(ThreadStart):ThreadStart 委托,它表示此线程开始执行时要调用的方法。适用于无参数的方法。

Thread(ParameterizedThreadStart):ParameterizedThreadStart 委托,它表示此线程开始执行时要调用的方法。适用于有参数传入的方法。

一个普通的 无参 线程操作如下:

[csharp] view plaincopyprint?01.Thread td = new Thread(xunhuan);//定义一个线程,参数是一个方法,无返回值,采用的是委托02.03.//前台线程,所有的线程都执行完了,应用程序才退出,默认的都是前台线程04.//后台线程,所有的前台线程都执行完了,就退出,不管后台的线程05.td.IsBackground = true; //设定为后台线程06.td.Start();//启动线程Thread td = new Thread(xunhuan);//定义一个线程,参数是一个方法,无返回值,采用的是委托//前台线程,所有的线程都执行完了,应用程序才退出,默认的都是前台线程//后台线程,所有的前台线程都执行完了,就退出,不管后台的线程td.IsBackground = true; //设定为后台线程td.Start();//启动线程一个有参的线程如下:
[csharp] view plaincopyprint?01.Thread ptd = new Thread(showname);//定义个线程,传入的带参数的方法。02.ptd.IsBackground = true;03.ptd.Start("lilei");//重载Start方法,传递个参数Thread ptd = new Thread(showname);//定义个线程,传入的带参数的方法。ptd.IsBackground = true;ptd.Start("lilei");//重载Start方法,传递个参数有参的方法定义,参数objec类型,
[csharp] view plaincopyprint?01.//线程调用,带多个参数02. static void shownames(object names)03. {04. List list = names as List;05. foreach (string name in list)06. {07. MessageBox.Show(name);08. }09.10. }//线程调用,带多个参数static void shownames(object names){List list = names as List;foreach (string name in list){MessageBox.Show(name);}}------------------------------------------------------------------------线程的状态-----------------------------------------------------------------------任何时候,线程都要处于某种线程状态中。新线程在Unstarted状态中开始它的生命周期。在调用Thread类的Start方法之前,会一直保持在Unstarted状态,调用方法之后,就会进入Started状态,并立即将程序的控制权返回调用程序(点了线程调用后,可以立即去干别的事)。然后,调用了Start方法的线程(也就是Started线程)和程序中其他的线程并发执行。线程的优先级每个线程都有个优先级,其范围在ThreadPriority.Lowest和ThreadPriority.Highest之间。默认情况下,每个线程的优先级都是Normal。Windows操作系统支持时间分片(timeslicing)的概念,它的思路是优先级相同的线程共享一个处理器。------------------------------------------------------------------------线程的同步和类监视器-----------------------------------------------------------------------通常,多个执行线程要操作共享数据。如果有权访问共享数据的线程只能读取数据,那就不需要阻止多个线程同时访问共享数据。然而,当多个线程共享数据,并且其中一个或多个线程要修改数据时,可能会出现无法预知的结果。如果一个线程正在更新数据,另一个线程也试图更新,那么数据所反映的就第二次更新操作之后的结果。所以可通过一次只允许一个线程访问用于操作共享数据的代码来解决。其他想要操作数据的线程应该等待。具有排他访问权的线程完成对数据的操作后,等待操作线程的数据可以继续执行。这称为互斥或线程同步。C#提供了两中解决技术:1.Monitor类:主要方法(方法传入的参数为objec对象,一般为当前调用的线程):Monitor.Enter():获取排他锁。Monitor.Wait():释放对象上的锁并阻止当前线程,直到重新获取该锁。Monitor.Pulse():通知等待队列中的线程对象状态的改变。Monitor.Exit():释放排他锁。2.lock关键字:在对象前加个lock:代码示例:Monitor的用法:
[csharp] view plaincopyprint?01.public class mt02. {03. private int age;04. private int buff = 0;//buff判断内容是否已被更新或提取,0为未更新,1为已更新05. int Age06. {07. get08. {09. Monitor.Enter(this);//获取此对象的排他锁10. if (buff == 0)//若内容为空或未更新就使此线程等待11. {12. MessageBox.Show("内容为空或未更新");13. Monitor.Wait(this);//释放锁并等待14. }15. buff--;16. MessageBox.Show("读取内容");17. Monitor.Pulse(this); //通知等待队列的线程,此对象状态要更改18. Monitor.Exit(this);//释放排他锁19. return age;20.21. }22. set23. {24. Monitor.Enter(this);25. if (buff == 1)26. {27. MessageBox.Show("内容还没被读取");28. Monitor.Wait(this);29. }30. buff++;31. MessageBox.Show("写入内容"+value);32. age = value;33. Monitor.Pulse(this);34. Monitor.Exit(this);35. }36. }37. }public class mt{private int age;private int buff = 0;//buff判断内容是否已被更新或提取,0为未更新,1为已更新int Age{get{Monitor.Enter(this);//获取此对象的排他锁if (buff == 0)//若内容为空或未更新就使此线程等待{MessageBox.Show("内容为空或未更新");Monitor.Wait(this);//释放锁并等待}buff--;MessageBox.Show("读取内容");Monitor.Pulse(this); //通知等待队列的线程,此对象状态要更改Monitor.Exit(this);//释放排他锁return age;}set{Monitor.Enter(this);if (buff == 1){MessageBox.Show("内容还没被读取");Monitor.Wait(this);}buff++;MessageBox.Show("写入内容"+value);age = value;Monitor.Pulse(this);Monitor.Exit(this);}}}lock的用法:
[csharp] view plaincopyprint?01.//lock的用法02. int Age203. {04. get05. {06. lock(this) //开始阶段,自获取了排他锁07. {08. if (buff == 0)//若内容为空或未更新就使此线程等待09. {10. MessageBox.Show("内容为空或未更新");11. Monitor.Wait(this);//释放锁并等待12. }13. buff--;14. MessageBox.Show("读取内容");15. Monitor.Pulse(this); //通知等待队列的线程,此对象状态要更改16. return age;17.18. }//结束阶段,释放了排他锁19. }20. set21. {22. lock (this)23. {24. if (buff == 1)25. {26. MessageBox.Show("内容还没被读取");27. Monitor.Wait(this);28. }29. buff++;30. MessageBox.Show("写入内容" + value);31. age = value;32. Monitor.Pulse(this);33. }34. }35.36. }//lock的用法int Age2{get{lock(this) //开始阶段,自获取了排他锁{if (buff == 0)//若内容为空或未更新就使此线程等待{MessageBox.Show("内容为空或未更新");Monitor.Wait(this);//释放锁并等待}buff--;MessageBox.Show("读取内容");Monitor.Pulse(this); //通知等待队列的线程,此对象状态要更改return age;}//结束阶段,释放了排他锁}set{lock (this){if (buff == 1){MessageBox.Show("内容还没被读取");Monitor.Wait(this);}buff++;MessageBox.Show("写入内容" + value);age = value;Monitor.Pulse(this);}}}-----------------------------------------------------------------lock 与 Monitor 的注意事项------------------------------------------------------------------Monitor注意的地方:用Monitor类的Enter方法和Exit方法来管理对象的锁时,要想释放锁,必须显示调用Exit方法。调用Exit方法之前如果某个方法中引发了一个异常,并且这个异常没有被捕捉到,方法就会终止,而且不会调用Exit方法。因此锁没有被释放。为了避免这种错误,可以将可能引发异常的代码放入一个try模块,并将对Exit方法的调用放在相应的finally块上以确保释放锁。使用一个Lock块来管理同步对象上的锁,可以避免忘记调用Monitor类的Exit方法来释放锁。Lock处于某种原因二终止时,C#会隐式调用Monitor类的exit方法。如此一来,即使在代码中出现异常,也可以将锁释放。 

如需更全面地了解编译器优化,请参阅优化注意事项.
RSS
Back to Top

Leave a Comment

To Obtain Technical Support, please go to Software Support

你的用户名 *
电子邮件 *

此内容将保密,不会被其他人看见。

首页
Comment *

作者

polk601001
Black Belt Points: 80

Related Content

使用VTune™ Amplifier XE 2013工作在Intel® Xeon Phi™ coprocessor的一般步骤
2012 英特尔软件网络博客大赛
基于英特尔平台的云设计与部署(VMware)
基于英特尔平台的云设计与部署(EMC)
英特尔Hadoop发行版

转载于:https://www.cnblogs.com/wsq724439564/archive/2012/11/13/3258218.html

[置顶] 黑马程序员 -- 多线程相关推荐

  1. [置顶] Java程序员们读什么书决定了对未来职业方向的选择

    学习Java最痛苦的事情莫过于对未来职业方向的选择.尤其是选择开发Java Application还是Java Web方向,在你先定好大类后还有数不尽的小类教你无从学起. 因此,作为初学者的你必须看完 ...

  2. [置顶] 完美程序员的10种品质

    完美程序员的10种品质 转载自:http://zhousir.net/ 谁是完美程序员?著名博客作家Alex Iskold在<明星软件工程师的10种特质>一文中给出这个问题的答案: 1. ...

  3. 微信小技能:微信收藏置顶变身程序员的日常待办事项和月计划(跟我一起做计划)

    文章目录 引言 I 微信小技能 1.3 收藏的使用技巧:微信变身代办事项 1.2 群管理技巧 1.3 微信号有效阅读 see also 引言 微信的收藏不仅支持置顶到聊天窗口,还支持添加待办事项,因此 ...

  4. 黑马程序员——多线程

    ------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...

  5. 黑马程序员—————— 多线程

    java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码).java使用线程执行体来代表这段 ...

  6. 黑马程序员—多线程,单线程

    ------- Windows Phone 7手机开发..Net培训.期待与您交流! ------- 单线程与多线程比较: 单线程只能做一件事情,多线程可以做多种事情.多线程的应用,可以让一个程序同时 ...

  7. 黑马程序员 多线程

    进程:是一个正在执行中的程序. 每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元. 线程在控制着进程的执行. 一个进程中至少有一个线程. ...

  8. 黑马程序员——多线程的实现(2+1)详解

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 方法1:继承Thread类 继承Thread类,重写run方法,把需要被线程执行的代码写到run ...

  9. 黑马程序员——总集篇

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 本人编写技术博客的时候只是针对章节的一些比较重要的知识点来编写的: 个人感觉质量 ...

最新文章

  1. Android offsetTopAndBottom 和 setTranslationY 的作用 和区别
  2. xampps开启mysql_xampps mysql无法启动
  3. php endall(),ob_end_flush
  4. 深入java并发包源码(三)AQS独占方法源码分析
  5. Promise 的基本使用 与 Ajax的jQuery封装
  6. 160 - 23 Chafe.1
  7. PIX525故障一例,求解
  8. 计算机通信事业单位专业知识点,事业单位计算机专业知识招考大纲
  9. linux简单几个小命令
  10. 想学大数据,应该从什么语言开始学?
  11. 教师计算机excel培训教案,信息技术教案:Excel中的函数
  12. java怎么实现微博评论_关于微博评论功能的设计与思考
  13. 关于网页视频下载方法及工具
  14. 【转】地址线和数据线的计算
  15. html返回的状态值,iradon函数返回的是什么值
  16. C#Directory常用方法
  17. js报错“TypeError: ‘stepUp‘ called on an object that does not implement interface HTMLInputElement”
  18. NLP是什么,百度的NLP技术有有哪些?
  19. 论文阅读《“The Boating Store Had Its Best Sail Ever”: Pronunciation-attentive ....》
  20. android欢迎页广告

热门文章

  1. 和睦小镇保卫战服务器位置,植物大战僵尸和睦小镇保卫战所有收集物品位置在哪_全收集要素攻略_3DM单机...
  2. JDK、JER、JVM是什么
  3. spring项目中使用slf4j和log4j2日志框架
  4. 300iq Contest 1
  5. elementui自定义进度条形状
  6. Android 形状绘制 —— shape详解
  7. beyond compare 3中文乱码
  8. unity 3d游戏开发_使用Unity 5开发3D游戏
  9. 让kaldi在Linux开发板上运行起来~ (测试运行篇)
  10. L2-1 盲盒包装流水线 (25 分)