认识ManualResetEvent

认识ManualResetEventManualResetEvent可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可以访问资源。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始执行)时

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

ManualResetEvent可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可以访问资源。 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始执行)时,它调用Reset将ManualResetEvent置于非终止状态。此线程可被视为控制ManualResetEvent。 调用ManualResetEvent上的WaitOne的线程将被阻止,并等待信号。当主控线程完成活动时,它调用Set以发出等待线程可以继续进行的信号,并释放所有等待线程。 一旦它被终止,ManualResetEvent将保持终止状态,直到它被手动重置,即对WaitOne的调用将立即返回。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ManualResetEventDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            MyThread myth = new MyThread();
            while (true)
            {
                Console.WriteLine("输入 stop 后台线程挂起 start 后台线程开始执行!");
                string cmd = Console.ReadLine();
                if (cmd.ToLower().Trim() == "stop")
                {
                    Console.WriteLine("后台线程停止运行...");
                    myth.Stop();
                }
                else if (cmd.ToLower().Trim() == "start")
                {
                    Console.WriteLine("后台线程开始执行...");
                    myth.Start();
                }
            }
        }
    }

    /// <summary>
    ///         | 调用Set被控线程可执行      |
    ///         |------------------------>|
    ///         |                         |
    /// 主控线程 |---->ManualResetEvent--->|被控线程
    ///         |        控制信号          |
    ///         |                         |  
    ///         |------------------------>|
    ///         |调用Reset被控线程停止运行    |
    /// </summary>
    class MyThread
    {
        Thread t = null;
        // ManualResetEvent允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。
        // 通过将布尔值传递给构造函数来控制ManualResetEvent的初始状态,如果初始状态处于终止状态,为true,否则为false。
        ManualResetEvent manualEvent = new ManualResetEvent(false); // 为true,一开始就可以执行,为false,后台线程处于阻塞态。
        private void Run()
        {
            while (true)
            {
                // 调用ManualResetEvent上的WaitOne方法的线程,称为被控线程。
                // 当主控线程调用ManualResetEvent上的Set方法,发出等待线程可以继续进行的信号,并释放所有等待线程,被控线程可执行。此时ManualResetEvent处于终止状态
                // 当主控线程调用ManualResetEvent上的Reset方法,被控线程将阻塞,并等待信号。此时ManualResetEvent处于非终止状态。
                manualEvent.WaitOne();
                Console.WriteLine("线程id:{0}",Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(200);
            }
        }
        public void Start()
        {
            manualEvent.Set();
        }
        public void Stop()
        {
            manualEvent.Reset();
        }
        public MyThread()
        {
            t = new Thread(Run);
            t.IsBackground = true;
            t.Start();
        }
    }
}

  

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

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

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

相关推荐

  • node.js介绍及其常用命令

    node.js介绍及其常用命令NodeJs简介:-node.js是提供了一个JavaScript的后台运行环境,简单地说就是运行在服务器端的JS浏览器是Javascript的前端网页的运行环境地址:https://nodejs.org/zh-cn/nodejs和javascript的区别1、nodejs中不支持DOM、BOM的操作支持JS的逻辑运算、函数、数据、json、对象、数组等操作2、专业的说法:Node.js是一个事件驱动I/O服务器的Javascipt运行环境,基于Google的V8引擎,V8引擎执行JS的

    2022年7月16日
  • 微软输入法打不了拼音_微软拼音输入法怎么用

    微软输入法打不了拼音_微软拼音输入法怎么用
    尽管已经来到了2010版本,依然无法快速地输入各种特殊符号。
    谁会愿意为了输入一个黑方框“■”,让自己繁忙的手离开键盘,
    让自己疲劳的眼神聚焦到输入条→一路猛击软键盘→特殊符号→选择→关闭软键盘呢?
     
    而如果你使用搜狗或其它同一时代(注意注意同一时代)的拼音输入法,
    完全没有这个烦恼,你只需要轻敲fk,出来的备选里再敲某个数字键就完成了。
     
    这么多年了,微软依然不懂得中国人需要一个什么样的拼音输入法,
    哪怕它可能

    2022年8月30日
  • python利用cookie登录(python爬虫教程pdf)

    http://blog.csdn.net/pipisorry/article/details/47948065实战1:使用cookie登录哈工大ACM网站获取网站登录地址http://acm.hit.edu.cn/hoj/system/login查看要传送的post数据user和passwordCode:#!/usr/bin/envpython#-*-

    2022年4月17日
  • Edgex foundry(Ireland-2.0版本)- Security 模式启动过程分析security-bootstrapper[通俗易懂]

    Edgex foundry(Ireland-2.0版本)- Security 模式启动过程分析security-bootstrapper[通俗易懂]EdegxFoundry:运行再边缘侧开源的,厂商中立的,灵活可定制的,支持交互操作的软件平台。可与设备、传感器、执行器和其他物联网对象的物理设备进行交互。简单地说,EdgeX是一种边缘中间件平台,服务于信息系统和IOT设备的感知操作(有关edgex的更多介绍,可查看edgex的的官方文档Introduction-EdgeXFoundryDocumentation)。Edegx官方提供了基于docker,可快速启动dockercompose文件,让用户可以快速体验到edgex提…

    2022年7月20日
  • python的三方库_py第三方库有哪些

    python的三方库_py第三方库有哪些Python常用第三方库可以在ThePythonPackageIndex(PyPI)软件库(官网主页:https://pypi.org/)查询、下载和发布Python包或库。网络爬虫requests:https://pypi.org/project/requests/简洁且简单的处理HTTP请求的第三方库 scrapy:https://scrap…

    2022年10月14日
  • openwrt做主路由_开发三问

    openwrt做主路由_开发三问一、CBI语法CBI去修改UCI配置文件的值,CBI是通过web控件选择值去修改UCI文件。,所有的CBI文件都必须返回一个luci.cbi.Map类型的对象。–translate()是因为字符串中有空格,如果没有空格就不用使用该函数m=Map(“cbi_file”,translate(“FirstTabForm”),translate(“Pleasefilloutthefo

    2022年10月29日

发表回复

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

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