博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ManualResetEvent
阅读量:6243 次
发布时间:2019-06-22

本文共 2489 字,大约阅读时间需要 8 分钟。

转自原文 

  线程是程序中的控制流程的封装。你可能已经习惯于写单线程程序,也就是,程序在它们的代码中一次只在一条路中执行。如果你多弄几个线程的话,代码运行可能会更加“同步”。在一个有着多线程的典型进程中,零个或更多线程在同时运行。但是,在有着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");}}}}

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。
    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6534989.html
,如需转载请自行联系原作者
你可能感兴趣的文章
MySQL索引面试题
查看>>
Systemd 入门教程:命令篇
查看>>
JS 常用函数垫片
查看>>
快速批量检查所有虚拟机的各项指标
查看>>
【软件开发底层知识修炼】五 gcc-C语言编译器
查看>>
React组件生命周期
查看>>
RxJava2.0的初学者必备教程(三)
查看>>
Git代码托管,SSH不同环境办公
查看>>
老司机 iOS 周报 #58 | 2019-03-11
查看>>
Hystrix问题记录
查看>>
Linux 上ps 命令的使用
查看>>
祛斑用什么产品比较好?简单一步轻松搞定
查看>>
OkHttp发起请求源码阅读(一)
查看>>
复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
查看>>
java spring cloud版b2b2c社交电商-配置中心svn示例和refresh
查看>>
回顾我的三年前端|掘金技术征文
查看>>
如何保障微服务架构下的数据一致性?
查看>>
开源框架和开源项目
查看>>
算法学习之路|二分图的最大匹配—匈牙利算法(Dfs实现)
查看>>
iOS UIView高级动画 关键帧动画
查看>>