认识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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • kong笔记——认识kong

    kong笔记——认识kong背景最近公司打算重构API网关,给定的硬性条件是支持lua脚本,kubernetes可部署,可解析lua,另外需要支持身份认证,IP黑白名单,限流,负载均衡等一些功能,为此,在技术选型上锁定了kong以及APISIX,最终选择了kong。(原因:稳定性第一,性能第二,拓展性第三,社区未来发展第四)为什么选择kong其实抛开lua的支持,kong的一些功能点还是很吸引我的,比如天生支持API网关的基本特性(权限控制,安全,负载均衡,请求分发,监控等等),即开箱即用。如果我们选择了zuul,当需要为应

    2022年6月26日
    118
  • shl归纳推理测试题库_逻辑推理测试题及答案-shl逻辑推理测试题目及答案[通俗易懂]

    shl归纳推理测试题库_逻辑推理测试题及答案-shl逻辑推理测试题目及答案[通俗易懂]公务员考试行政能力逻辑推理测试题及答案一1.所有市场经济搞得好的国家都是因为法律秩序比较好。其实建立市场并不难,一旦放开,人们受利益的驱使,市场很快就能形成,但是,一个没有秩序的市场一旦形成,再来整治就非常困难了。所以()。A.市场调节是“无形的手”,市场自发地处于稳定、均衡的状态B.要建立市场经济体制,必须高度重视法制建设C.市场经济的优越之处就在于它能使人们受利益驱使,因而能调动人的积极性D…

    2022年9月8日
    0
  • oracle的rownumber机制[通俗易懂]

    oracle的rownumber机制[通俗易懂]rownumber伪列(动态计算):rownumber必须从1开始计算,必须外面嵌套一层才可以,rownum是查询时候动态生成的从1开时候,所以whererownumber=2返回空,rownumber=1可以查到,rownumber>=1可以查到,rownumber

    2022年6月12日
    43
  • Python快速编程入门课后习题答案「建议收藏」

    Python快速编程入门课后习题答案「建议收藏」文章目录前言第一章一、填空题二、判断题三、选择题四、简答题第二章一、填空题二、判断题三、选择题四、简答题第三章一、填空题二、判断题三、选择题四、简答题第四章一、单选题二、判断题三、填空题四、程序分析题第五章一、选择题二、判断题三、填空题四、简答题五、程序分析题第六章一、单选题二、判断题三、填空题四、简答题五、程序分析题第七章一、单选题二、判断题三、填空题四、简答题五、程序分析题第八章一、单选题二、…

    2022年6月3日
    156
  • 简单的爬取百度图片,一页

    简单的爬取百度图片,一页

    2021年9月17日
    44
  • 计算机写字板英语,写字板的英文是什么

    计算机写字板英语,写字板的英文是什么写字板我们从小学就看起了,当然它的英语单词我们也是从小学就学习到了。下面是学习啦小编给大家整理的写字板的英文是什么,供大家参阅!写字板的英文是什么blackboard英[ˈblækbɔ:d]美[ˈblækbɔrd]写字板的英语例句1.Tomscrawledonhisslate,”Pleasetakeit–Igotmore.”汤姆在他的写字板上写了几个字:“请…

    2022年7月16日
    25

发表回复

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

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