ManualResetEvent

简介:

转自原文 ManualResetEvent

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



相关文章
|
SQL 存储 Web App开发
PolarDB-X 分布式数据库中的外键
外键是关系型数据库中非常便利的一种功能,它通过一个或多个列为两张表建立连接,从而允许跨表交叉引用相关数据。外键通过约束来保持数据的一致性,通过级联来同步数据在多表间的更新和删除。在关系数据库系统中,大多数表都遵循外键的概念。
|
Web App开发 缓存 监控
Apollo插件:个性化你的开发流程
Apollo插件:个性化你的开发流程
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
291 2
|
存储 安全 物联网
未来已来:探索区块链、物联网与虚拟现实的创新融合
【8月更文挑战第5天】随着科技的迅猛发展,新兴技术如区块链技术、物联网(IoT)以及虚拟现实(VR)正逐步渗透到我们生活的方方面面。本文将深入探讨这些技术的发展趋势,并分析其在多个行业中的应用场景,旨在揭示它们如何相互交织,共同塑造我们的未来。
|
安全 网络协议 网络安全
无需花钱!教你申请免费 IP 地址 SSL 证书的完整指南
为IP地址配置SSL证书较为复杂,因大多数免费SSL证书仅支持域名验证,而不支持IP地址。SSL证书基于域名进行身份验证,而IP地址缺乏类似机制。通常,免费证书提供商如Let&#39;s Encrypt不支持IP地址,但JoySSL提供针对IP地址的免费试用SSL证书服务。用户需访问JoySSL官网注册并填写特定注册码230922获取资格,后续按提示提交申请并验证IP地址所有权。审核通过后可获得证书。JoySSL还提供多样化的证书选择、简便申请流程和优质技术支持,满足不同需求。
|
小程序 算法 Java
【技巧】Git提交描述骂了领导,不会删除提交记录咋办!
本文以一次git提交失误的故事为背景,详细介绍了如何使用`git revert`和`git reset`两个命令来撤销错误提交。`git revert`用于撤销提交并创建新提交以保留历史记录,而`git reset`则通过移动HEAD指针来修改提交历史,不创建新提交。文章通过实例演示了具体操作步骤,帮助读者在遇到类似问题时能够从容应对。
593 1
【技巧】Git提交描述骂了领导,不会删除提交记录咋办!
|
存储 DataWorks NoSQL
DataWorks产品使用合集之如果作业选了独享调度资源,后期任务阻塞,会自动分配到公共调度资源运行吗
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
165 8
|
存储 缓存 IDE
CMake之编写属于自己的Findxxx.cmake文件:定义一个定制化的CMakeLists.txt文件
CMake之编写属于自己的Findxxx.cmake文件:定义一个定制化的CMakeLists.txt文件
497 1
|
Web App开发 JavaScript Android开发
webRTC(十五),2024最新Android中级面试题目汇总解答
webRTC(十五),2024最新Android中级面试题目汇总解答
|
Python
Pycharm给python文件设置作者,时间等备注信息
Pycharm给python文件设置作者,时间等备注信息
691 0
Pycharm给python文件设置作者,时间等备注信息