认识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)
上一篇 2022年7月4日 下午12:00
下一篇 2022年7月4日 下午12:00


相关推荐

  • 基于Auto.js的萌猫跳辅助

    基于Auto.js的萌猫跳辅助许久不见,甚是想念被学长唤醒的博客魂ing…这次是一个失去时效性的小脚本,但是其中包括一些东西或许对你们可以有帮助撒一些要点因为Auto.js并没有直接的对于触控位置的监听,所以需要对安卓API进行调用2.涉及对于画布的使用importClass(android.graphics.PorterDuffXfermode);importClass(android.graphics.PorterDuff);constBG_COLOR=colors.parseColor(“#2d

    2022年6月6日
    43
  • autossh原理解析

    autossh原理解析authssh 用来帮助 ssh 程序在中断后自动重连 在建立隧道的场合相当好用 它是怎么检测链路的呢 我们先来看一下它的使用方法 autossh V Mport echo port f SSH OPTIONS 举例 autossh M10001 10002 N R10000 127 0 0 1 22example com 这个例子的意思是 执行 ss

    2026年3月18日
    1
  • javaweb-svn-1-60

    javaweb-svn-1-60

    2021年5月18日
    107
  • linux如何压缩zip文件格式,linux下常用压缩格式的压缩与解压方法

    linux如何压缩zip文件格式,linux下常用压缩格式的压缩与解压方法linux 下常用压缩格式的压缩与解压方法 linux 下常用压缩格式的压缩与解压方法大致总结了一下 linux 下各种格式的压缩包的压缩 解压方法 但是部分方法我没有用到 也就不全 希望大家帮我补充 我将随时修改完善 谢谢 作者 Linux 爱好者来自 www LinuxByte net 最后更新时间 2004 4 7 tar 解包 tarxvfFileNa tar 打包 tarcvfFileNa

    2026年3月26日
    2
  • javaCV开发详解之2:推流器和录制器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV、FFMPEG和openCV)「建议收藏」

    javaCV开发详解之2:推流器和录制器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV、FFMPEG和openCV)「建议收藏」javaCV系列文章:javacv开发详解之1:调用本机摄像头视频javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG)javaCV开发详解之4:转流器实现(也可作…

    2022年6月6日
    77
  • java指令重排_jvm指令重排

    java指令重排_jvm指令重排引言:在Java中看似顺序的代码在JVM中,可能会出现编译器或者CPU对这些操作指令进行了重新排序;在特定情况下,指令重排将会给我们的程序带来不确定的结果…..1.什么是指令重排?在计算机执行指令的顺序在经过程序编译器编译之后形成的指令序列,一般而言,这个指令序列是会输出确定的结果;以确保每一次的执行都有确定的结果。但是,一般情况下,CPU和编译器为了提升程序执行的效率,会按照一定的规则允…

    2022年10月18日
    4

发表回复

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

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