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();
    }
}

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • FindWindow使用方法

    FindWindow使用方法

  • docker搭建kafka集群

    docker搭建kafka集群docker搭建kafka集群我在M1mbp上使用的以下镜像新建文件zk-kafka-docker-compose.ymlversion:”2″services:zookeeper:user:rootimage:docker.io/zookeeperports:-“12181:2181″environment:-ALLOW_ANONYMOUS_LOGIN=yesvolumes:-zoo

  • vmware不可恢复的vcpu-0_vmware与device不兼容

    vmware不可恢复的vcpu-0_vmware与device不兼容VMwareWorkstation不可恢复错误:(vcpu-0)解决方法我的虚拟机解决方案,真实实用你可以使用下面的解决办法:1、在安装的虚拟机处右键->设置>处理器>虚拟化引擎>首选模式,选择“IntelVT-xorAMD-V";2、在运行虚拟机后提示:此主机支持IntelVT-x,但被禁用了!重启电脑进入BIO

  • ipv4和ipv6对比(IPV4)

    TCP/IP的心脏是互联网层,这一层主要由IP和ICMP两个协议组成。IP相当于OSI参考模型中的第三层——网络层。而网络层的作用是实现终端节点之间的通信。这种终端节点之间的通信也叫‘点到点’通信。IP地址用于连接在网络中的所有主机中识别出进行通信的目标地址。谷在tcp/ip通信的所有主机中必须设置IP地址。路由控制、多条路由和路由控制表使得数据包可以成功抵达要去的地方。路由控制表记录着此…

  • electron 安装_electron修改文件描述

    electron 安装_electron修改文件描述1、安装node.js例如:安装在F://node下;2、cmd控制台:F:回车,进入F盘,cdnode回车,进入node文件夹,node-v回车,查看node版本,npm-v回车,查看npm版本,若出现版本号,表示安装成功;3、在cmd控制台,node文件夹下,把npm仓库切换到国内taobao仓库,速度会快很多,命令如下:npminstall-gcnpm–registry=https://registry.npm.taobao.org

  • checkbox选中和不选中 jqu_jquery checkbox 选中不选中[通俗易懂]

    checkbox选中和不选中 jqu_jquery checkbox 选中不选中[通俗易懂]展开全部$(function(){//动态绑定默认状态//$(“#ck”).attr(“checked”,true)//选中//$(“#ck”).attr(“checked”,false)//未选中//点击判断选中还是未选中$(“#ck”).click(function(){if($(this).is(“:checked”)){alert(“选中”);}else{alert…

发表回复

您的电子邮箱地址不会被公开。

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