转之:http://blog.tom.com/blog/read.php?bloggerid=313638&blogid=13505

Thread and Sync In C# (C#中的线程与同步)
    线程是程序中的控制流程的封装。你可能已经习惯于写单线程程序,也就是,程序在它们的 代码中一次只在一条路中执行。如果你多弄几个线程的话,代码运行可能会更加“同步”。在一个有着多线程的典型进程中,零个或更多线程在同时运行。但是,在 有着N个CPU的机器上,一个线程只能在给定的时间上在一个CPU上运行,因为每个线程都是一个代码段,每个CPU一次只能运行一段代码。而看起来像是N 个同时完成是线程间共享CPU时间片的效果。这个例子里,我们将创建另一个线程,我们将用两个线程演示多线程的工作方式,最后,我们实现两个线程(主线程 与新线程)同步,在新线程工作前必须等待消息。建立线程前我们必须引入System.Threading命名空间。然后我需要知道的是,线程得为控制流程 建立一个起点。起点是一个函数,可以使一个相同的调用或其它。

这里你可以看到在同一个类中定义的起点函数。

using  System;
using  System.Threading;
namespace  ThreadingTester
{
class  ThreadClass
{
   public   static   void  trmain()
   {
     for ( int  x = 0 ;x  <   10 ;x ++ )
     {
    Thread.Sleep( 1000 );
    Console.WriteLine(x);
    }
  }   
   static   void  Main( string [] args)
   {
    Thread thrd1 = new  Thread( new  ThreadStart(trmain));
    thrd1.Start();
     for ( int  x = 0 ;x  <   10 ;x ++ ) 
     {
    Thread.Sleep( 900 );
    Console.WriteLine( " Main    : "   +  x);
    }
  }
}
}

Thread.Sleep(n)方法把“this”线程置于n毫秒的休眠状态。你可以看看这个例子,在主函数我们定义了一个新的线程,其中它的起 点是函数trmain(),我们然后包含了Start()方法开始执行。如果你运行这个例子,你就会了解线程间的切换(让CPU从运行一个线程转到另一个 线程)让线程几乎同时运行,为了能看哪个线程运行更快我把主线程设置比新线程少100毫秒。
现在,在开始线程前,先给线程命名:
  Thread thrd1=new Thread(new ThreadStart(trmain));
  thrd1.Name="thread1";
  thrd1.Start();
  Thread tr = Thread.CurrentThread;
  Console.WriteLine(tr.Name);
在完成上面程序后,设想我们不想在一开始新线程就让它马上运行结束,也就是说,我们开启了一个新线程,让它运行,在某个特定的时间点,新线程暂停并等待从主线程(或其他线程)发来的消息。
我们可以这样定义:
  public static ManualResetEvent mre = new ManualResetEvent(false);
ManualResetEvent建立时是把false作为start的初始状态,这个类用于通知另一个线程,让它等待一个或多个线程。注意,为了通知或监听同一个线程,所有的其它线程都能访问那个类。
等待线程这样写:
  mre.WaitOne();
这将引起等待线程无限期的阻塞并等待类来通知。
发信号的线程应该这样:
  mre.Set();
这样类就会被通知,值变成true,等待线程就会停止等待。在通知事件发生后,我们就可以使用下面语句把线程置于基状态:
  mre.Reset();
现在让我们在程序执行一下:

using  System;
using  System.Threading;
namespace  ThreadingTester
{
class  ThreadClass
{
public   static  ManualResetEvent mre = new  ManualResetEvent( false );
public   static   void  trmain()
{
Thread tr  =  Thread.CurrentThread;
Console.WriteLine( " thread: waiting for an event " );
mre.WaitOne();
Console.WriteLine( " thread: got an event " );
for ( int  x = 0 ;x  <   10 ;x ++ )
{
Thread.Sleep( 1000 );
Console.WriteLine(tr.Name  + " :  "   +  x);
}
}   
static   void  Main( string [] args)

{
Thread thrd1 = new  Thread( new  ThreadStart(trmain));
thrd1.Name = " thread1 " ;
thrd1.Start();
for ( int  x = 0 ;x  <   10 ;x ++ ) 
{
Thread.Sleep( 900 );
Console.WriteLine( " Main: "   +  x);
if ( 5 == x) mre.Set();
}
while (thrd1.IsAlive)
{
Thread.Sleep( 1000 );
Console.WriteLine( " Main: waiting for thread to stop " );
}
}
}
}

ManualResetEvent用法详解相关推荐

  1. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  2. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  3. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  4. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  5. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  6. php theme_path,PHP_Yii2主题(Theme)用法详解,本文实例讲述了Yii2主题(Theme) - phpStudy

    Yii2主题(Theme)用法详解 本文实例讲述了Yii2主题(Theme)用法.分享给大家供大家参考,具体如下: 首先看看主要的配置方式: 'components' => [ 'view' = ...

  7. LayoutInflater的inflate函数用法详解

    LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...

  8. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...

  9. WinDbg用法详解

    WinDbg用法详解 对WinDbg的方方面面作了详细的讲解. 转载于:https://blog.51cto.com/laokaddk/125111

最新文章

  1. 时空复杂度(时间复杂度/空间复杂度)O(1)、O(n)、O(n^2)、O(log n)、O(n log n)是什么意思?...
  2. 各种格式的视频播放的代码(wma格式)
  3. Computer:成功解决安装软件时需要系统空间环境辅助程序(比如Microsoft Visual C++2010 x86 Redistributable安装失败)
  4. CLR Essential Types
  5. Linux 常見的登錄檔檔名
  6. Notes on language modeling-COMS W4705: Natural Language Processing-学习笔记
  7. WPF 分页控件应用
  8. 服务器系统重置,云服务器系统重置
  9. java 异常 中英文_史上最全的Java中所有Exception异常中英文对照
  10. 求大数的阶乘方法(数组)
  11. Jmeter压力测试快速使用
  12. Javasript中Date日期常用用法(正则、比较)
  13. 输入法快捷键_关于日语输入法,你需要知道的一切
  14. 世界主要粮食作物和经济作物的生产及其分布
  15. day_05 运算符 if和while的使用
  16. Winfrom控件的使用
  17. 国美易卡利用数据挖掘技术,国美易卡精准分析决策
  18. python 使用QPixmap显示图片扭曲、错位问题的解决
  19. Spring XML 注入
  20. python实现KNN算法并可视化展示

热门文章

  1. Ubuntu14.04下安装vim显示没有可用的软件包vim-gtk
  2. JS/jQuery 遍历对象属性
  3. 视频目标检测与轨迹跟踪代码案例
  4. Java线程状态转化
  5. 数据分析实战 | 银行 “信贷” 客户的可视化分析
  6. 登录华科校园网,我用Socket
  7. 找技术公司开发小程序需要注意些什么?
  8. java test1
  9. 《面向对象程序设计》课程设计报告
  10. And and Pair