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

  

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

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

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

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

(0)


相关推荐

  • 关于putty连接服务器提示server unexpectedly closed connection解决方法「建议收藏」

    关于putty连接服务器提示server unexpectedly closed connection解决方法「建议收藏」1.今日在对服务器进巡检时,发现无法使用putty连接到服务器,提示错误serverunexpectedlyclosedconnection。之前在连接服务器的时候也没遇到这样的情况,遂在网上进

  • 【网络教程】群晖修改 sn 和 MAC,生成器,cpolar内网穿透[通俗易懂]

    【网络教程】群晖修改 sn 和 MAC,生成器,cpolar内网穿透[通俗易懂]参考文章1参考文章2更多

  • ADRC算法Auto Disturbances Rejection control

    ADRC算法Auto Disturbances Rejection control 自抗扰控制 其中,e=v(t)-y(t)是控制系统参考输入量v(t)与被控对象输出量y(t)之间的差值,kp比例系数,ki积分系数,,kd微分系数优点:1.仅由误差来决定控制2.运算量低,可以以极高的速率运行缺点:1.误差的取法e=v-y,使得初始时刻误差较大,容易造成控制系统快速性和超调的矛盾,比如输入为阶跃信号的时候,会导致误差函数也是一个阶跃信号,对…

  • Java常用设计模式

    Java常用设计模式一、设计模式概念1、定义​Java包含23种设计模式,是一套对代码设计经验的总结,被人们反复利用,多人熟知的代码设计方式。2、目的​为了提高代码的可读性,可扩展性以及代码的复用性,为了解决在写代码过程中遇到的代码设计问题。3、设计模式的六大原则​3.1开闭原则​对扩展开放,对修改关闭(尽可能对代码少修改)​3.2里氏替换原则​它是面向对象基本原则之一,任何父类(基类)出现的地方,子类都可以出现,也就是子类可以替换父类的任何功能(体现了父类的可扩展性)3.3依赖

  • PyCharm常用设置(图解)

    PyCharm常用设置(图解)1.保存设置pycharm中的设置是可以导入和导出的,file>exportsettings可以保存当前pycharm中的设置为jar文件保存在桌面上2.导入设置重装时可以直接importsettings>jar文件,就不用重复配置了确认是否要导入点击确认重新启动3.设置Python自动引入包设置Python自动引入包,要先在…

  • mysql的驱动jar包_各版本MySQL数据库驱动程序jar包大全(java连接mysql驱动jar包)

    mysql的驱动jar包_各版本MySQL数据库驱动程序jar包大全(java连接mysql驱动jar包)java连接mysql数据库,数据库程序开发步骤首先就要加载JDBC驱动程序,不同版本的mysql数据库需要的MySQL数据库驱动程序jar包版本也不同。不少同学问怎么下载java连接mysql的驱动jar包?今天给大家分享:各版本MySQL数据库驱动程序jar包大全(java连接mysql驱动jar包)项目中如何加载MySQL数据库驱动程序jar包如:mysql-connector-java-8…

发表回复

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

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