ManualResetEvent使用演示

ManualResetEvent使用演示ManualResetEvent允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用Reset以将ManualResetEvent置于非终止状态。此线程可被视为控制ManualResetEvent。调用ManualResetEvent上的WaitOne的线程将阻止,并等待

大家好,又见面了,我是你们的朋友全栈君。

ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。
当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。
可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。

public class EventClient : Form
{
    private Button CreateThreas;
    private ManualResetEvent m_Event1;
    private Button Signal;
    private Button Reset;


    public EventClient()
    {
        InitializeComponent();
        m_Event1 = new ManualResetEvent(false);
    }

    private void InitializeComponent()
    {
        // 
    }
    
    [STAThread]
    static void Main() 
    {
        Application.Run(new EventClient());
    }

    // 创建线程
    private void OnCreateThreads(object sender,EventArgs e)
    {
        ThreadStart threadStart = new ThreadStart(Start);
        Thread thread1 = new Thread(threadStart);            
        thread1.Start();

        Thread thread2 = new Thread(threadStart);            
        thread2.Start();

    }

    // 线程执行体
    protected void Start()
    {
        // 阻塞当前线程线程
        m_Event1.WaitOne();
        
        int threadID = Thread.CurrentThread.GetHashCode();
        string caption = "Thread ID = " + threadID;
        MessageBox.Show("Stopped Waiting",caption); 
    }

    private void OnSignal(object sender,EventArgs e)
    {
        // 通知被m_Event1阻塞的线程继续执行
        // 这里是thread1, thread2
        m_Event1.Set();
    }

    private void OnReset(object sender,EventArgs e)
    {
        m_Event1.Reset();
    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161180.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 投影矩阵介绍[通俗易懂]

    投影矩阵介绍[通俗易懂]一般我们是将相机模型简化成针孔相机模型,那么相平面与相机坐标系之间的关系为:通常为了方便,会把相平面放在小孔与目标点之间。下面就介绍下相平面投影的三种不同方法。透视投影(perspectiveprojection)通过相似三角形(下图两个虚线三角形)可以得到下列关系:展开就是:这里x_h等为齐次坐标系坐标,X等为相机坐标系点,x等则为相平面上的透视投影点,可以看出,投影点的位置不仅仅是与X等有简单的缩放关系,还和Z成反比,Z越大投影点x等越小,这就

    2022年9月28日
    3
  • C#与.NET的区别和C#程序结构

    C#与.NET的区别和C#程序结构C#语言及其特点(1)语法简洁,不允许直接操作做内存,去掉指针操作(2)彻底的面向对象设计,C#具有面向对象所应用的一切特性:封装、继承、多态(3)与Web紧密结合,C#支持绝大多数的Web标准

    2022年7月4日
    22
  • android listview去掉分割线

    android listview去掉分割线1》设置android:divider=”@null”2》android:divider=”#00000000″#00000000后面两个零表示透明3》.setDividerHeight(0)高度设为0

    2022年7月22日
    11
  • 谷歌地图 离线地图_地图谷歌高清手机版

    谷歌地图 离线地图_地图谷歌高清手机版离线地图解决方案,除了买地图数据,使用专业的ArcGIS来做外,也可以使用GMap.Net来做。关于GMap的开发教程,可以看我以前的文章:基于GMap.Net的地图解决方案使用了GMap一年了,也有了一些积累,开发了一个可以下载ArcGIS、百度、谷歌、高德、腾讯SOSO、天地图、Here等地图的地图下载器。百度和google地图加载显示如下:百度普通地图:百度混合地图:…

    2026年2月1日
    5
  • 设备树 dtb结构

    设备树 dtb结构dtb 结构由一个小的报头和三个大小可变的部分组成 内存预留块 结构块和字符串块 这些应该按这个顺序出现在扁平的设备树中 因此 设备树结构作为一个整体 当以地址载入内存时 将类似于下图的图 较低的地址位于图的顶部 注 内存预留块可能不存在 尽管在某些情况下可能需要它们来满足单个块的对齐约束 自格式的原始定义以来 已经定义了几种扁平设备树结构的版本 报头中的字段给出了版本 以便客户端程序可以确定设备树是否以兼容的格式编码 本文档仅描述 17 版的格式 兼容 DTSpec 的引导程

    2025年6月22日
    4
  • 动态库学习[通俗易懂]

    动态库学习[通俗易懂]总结一:动态库前言 我们知道程序编译链接经常使用动态,同时我们可能还知道,动态库时程序运行时加载的。但是动态库到底有什么作用,如何生成、如何加载等,我们却很少关注。接下来,我给大家做一个简单的介绍。1.1动态库和静态库的区别静态库特点(linux):命名上是以*.o结尾静态库在链接阶段直接就加入到可执行的文件中了,在执行过程中无需该静态库相对于动态库生成的文件,使用静态库生…

    2022年9月30日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号