zoukankan      html  css  js  c++  java
  • AutoResetEvent和ManualResetEvent

    本文在于巩固基础

    AutoResetEvent

    概念:通知正在等待的线程已发生的事件

    如果AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资源可用。 调用Set 向AutoResetEvent 发信号以释放等待线程。

    可以通过构造函数设置事件状态 false为非终止,true为终止

    常用方法:

    Set();将事件状态设置为终止状态,允许一个或多个等待线程继续。

    ReSet();将事件状态设置为非终止状态,导致线程阻止

    WaitOne();阻止当前线程,直到当前 WaitHandle 收到信号。

    ManualResetEvent用法差不多,有一点差别,在下面可以看到

    下面通过一个简单实例来演示这个基本用法

     

    class Program
        {
            //设置事件状态为非终止
            
            private static ManualResetEvent _manualResetEvent=new ManualResetEvent(false);
            private static Thread _thread = new Thread(new ThreadStart(ThreadMethod));
            private static int _count = 0;
            static void Main(string[] args)
            {
                _thread.Start();
                Console.ReadLine();
                _manualResetEvent.Set();// 通知等待线程继续
    
    
            }
    
            private static void ThreadMethod()
            {
                while (true)
                {
                    _manualResetEvent.WaitOne();//由于上面设置事件状态为非终止所以下面语句不会执行,除非收到可以继续的信号
                    Thread.Sleep(1000);
                    Console.WriteLine(_count++);
    
    
                }
            }

     

    一开始不会有输出,直到你输入数据后线程才会继续

    结果如下

    W
    0
    1
    2
    3
    4
    5
    6
    7
    8

    ...

     注意这里AntoResetEvent中的WaitOne方法会切换信号(不怎么专业,明白就好),也就是,这次是收到信号,下次就变成无信号,再执行又有信号,如此往复

    下面是AntoResetEvent实现

     class Program
        {
            //设置事件状态为非终止
            
            private static AutoResetEvent _autoResetEvent=new AutoResetEvent(false);
            private static Thread _thread = new Thread(new ThreadStart(ThreadMethod));
            private static int _count = 0;
            static void Main(string[] args)
            {
                _thread.Start();
                Console.ReadLine();
                _autoResetEvent.Set();
    
    
            }
    
            private static void ThreadMethod()
            {
                while (true)
                {
                    _autoResetEvent.WaitOne();//由于上面设置事件状态为非终止所以下面语句不会执行,除非收到可以继续的信号
                    Thread.Sleep(1000);
                    Console.WriteLine(_count++);
                    _autoResetEvent.Set();//上面的WaitOne执行后变为无信号,这样下次循环就阻塞了,这步可以使下次循环接收到继续的信号
    
    
                }
            }
    
    
        }

     

     

     

  • 相关阅读:
    Mariadb Galera Cluster 群集 安装部署
    RabbitMQ Cluster群集安装配置
    Glance 镜像服务群集
    Nova控制节点集群
    openstack集群环境准备
    http高可用+负载均衡 corosync + pacemaker + pcs
    cinder块存储控制节点
    cinder块存储 后端采用lvm、nfs安装配置
    web管理kvm ,安装webvirtmgr
    kvm虚拟机管理 系统自动化安装
  • 原文地址:https://www.cnblogs.com/jixinyu/p/4308670.html
Copyright © 2011-2022 走看看