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


相关推荐

  • 20行Python代码爬取王者荣耀全英雄皮肤

    20行Python代码爬取王者荣耀全英雄皮肤引言王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。准备工作爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网:我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片…

    2022年5月5日
    71
  • 云端呼叫中心坐席并发测试结果[通俗易懂]

    云端呼叫中心坐席并发测试结果[通俗易懂]很久没有写关于asterisk压力测试的相关文章了。今晚终于可以抽一点时间来写点东西,跟大家来分享一下。以下是本人最近开发的一套云端虚拟坐席租用系统,历经半年时间的实现和优化。          在近段时间,云端服务器是一个比较很热门话题,并且很大程度上综合硬件的资源的,节约成本的同时,还有的好处就是简化服务器部署的难度和时间。其他关于云端服务的其他好处,在此不必多说了,大家可以参考一

    2022年7月12日
    25
  • WEB各种环境以及注意事项「建议收藏」

    WEB各种环境以及注意事项「建议收藏」WEB各种环境以及注意事项

    2022年4月22日
    86
  • 安装VM虚拟机教程

    安装VM虚拟机教程虚拟机安装及新建指南安装 VM 虚拟机创建虚拟机开启虚拟机安装 VM 虚拟机待定创建虚拟机 1 新建虚拟机 2 默认选择自定义 直接下一步 3 默认点击下一步 4 默认点击下一步 5 这里我选择的是 Linux 系统 默认点击下一步 6 更改虚拟机名称及安装位置 7 选择处理器数量 8 选择虚拟机内存 9 默认下一步 10 默认下一步 11 默认下一步 12 默认下一步 13 分配磁盘大小 14 磁盘文件名 默认下一步 15 选择自定义硬件 16 选择使用的镜像文件 17 点击完成

    2025年8月18日
    6
  • debian详细安装教程_debian 安装ssh

    debian详细安装教程_debian 安装ssh1.安装 按照这篇图文并茂的文章安装http://www.itwhy.org/2011/07-27/694.html2.安装ssh安装好后登录并切换到root用户,使用命令apt-getinstallssh一串协议后输入大写Y同意协议,ssh会自动安装并启动

    2022年10月19日
    5

发表回复

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

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