zoukankan      html  css  js  c++  java
  • C#——ManualResetEvent的理解和用法

        先了解一下ManualResetEvent的基本用法:

    1、初始化:public ManualResetEvent(bool initialState);

      ManualResetEvent的构造方法有个bool型参数,当为true时,则表示有信号,为false时,则表示无信号。

          这个怎么理解呢?我们接着看ManualResetEvent3个基本方法中的WaitOne方法。

    2、WaitOne方法:WaitOne方法有几种4种重载,我在这里只对它的功能进行分析。

      WaitOne方法,顾名思义,它会具有一种等待的功能,也就是线程阻塞。

          这里的阻塞功能是有条件的,当无信号时,它是阻塞的,有信号时,它将无任何阻塞,被执行时就直接跳过了。

           所以,回顾到1,当初始化ManualResetEvent时,initialState为false,WaitOne将会有阻塞效果,否则,没有阻塞效果。

    3、Set方法:将ManualResetEvent对象的信号状态设为有信号状态,

         这个时候WaitOne如果正在阻塞中的话,将会立即终止阻塞,向下继续执行。

         而且这个状态一直不变的话,每次执行到WaitOne都将无任何阻塞。

    4、Reset方法:

         将ManualResetEvent对象的信号状态设为无信号状态,当下次执行到WaitOne时,又将重新开始阻塞。

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace ThreadTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                new ProductAndCostTester();
            }
        }
    
        /// <summary>
        /// 生产消费模型
        /// </summary>
        public class ProductAndCostTester
        {
            /// <summary>
            /// 生产线1线程
            /// </summary>
            private Thread _producterThread1;
            /// <summary>
            /// 生产线2线程
            /// </summary>
            private Thread _producterThread2;
            /// <summary>
            /// 消费线线程
            /// </summary>
            private Thread _costerThread;
            /// <summary>
            /// 产品列表
            /// </summary>
            private List<int> _goodList;
            /// <summary>
            /// ManualResetEvent实例
            /// </summary>
            private ManualResetEvent _mre;
    
            public ProductAndCostTester()
            {
                _goodList = new List<int>();
    
                _mre = new ManualResetEvent(false);//false初始化状态为无信号,将使WaitOne阻塞
    
                _producterThread1 = new Thread(Product1);
                _producterThread1.Name = "Productor1";
                _producterThread1.Start();
    
                _producterThread2 = new Thread(Product2);
                _producterThread2.Name = "Productor2";
                _producterThread2.Start();
    
                _costerThread = new Thread(Cost);
                _costerThread.Name = "Costor";
                _costerThread.Start();
            }
    
            /// <summary>
            /// 生产线1
            /// </summary>
            void Product1()
            {
                while (true)
                {
                    Console.WriteLine(Thread.CurrentThread.Name + ":" + DateTime.Now.ToString("HH:mm:ss"));
                    for (int i = 0; i < 3; i++)
                    {
                        _goodList.Add(1);
                    }
                    _mre.Set();//表示有信号了,通知WaitOne不再阻塞
    
                    Thread.Sleep(8000);
                }
            }
    
            /// <summary>
            /// 生产线2
            /// </summary>
            void Product2()
            {
                while (true)
                {
                    Console.WriteLine(Thread.CurrentThread.Name + ":" + DateTime.Now.ToString("HH:mm:ss"));
                    for (int i = 0; i < 6; i++)
                    {
                        _goodList.Add(1);
                    }
                    _mre.Set();//表示有信号了,通知WaitOne不再阻塞
    
                    Thread.Sleep(10000);
                }
            }
    
            /// <summary>
            /// 消费线
            /// </summary>
            void Cost()
            {
                while (true)
                {
                    if (_goodList.Count > 0)
                    {
                        Console.WriteLine("Cost " + _goodList.Count + " at " + DateTime.Now.ToString("HH:mm:ss"));
                        _goodList.Clear();
                        _mre.Reset();//重置为无信号了,使WaitOne可以再次阻塞
                    }
                    else
                    {
                        Console.WriteLine("No cost at " + DateTime.Now.ToString("HH:mm:ss"));
                        _mre.WaitOne();//如果没有可消费的产品,即无信号,则会阻塞
                    }
                }
            }
        }
    }
    复制代码
  • 相关阅读:
    马云:员工的离职原因--转载
    zookeeper源码分析之五服务端(集群leader)处理请求流程
    技术高手如何炼成?--转自知乎
    一次上线事故经验
    zookeeper源码分析之四服务端(单机)处理请求流程
    AngularJS2.0 quick start——其和typescript结合需要额外依赖
    typescript 入门例子 Hello world——ts就是一个宿主机语言
    Kubernetes——自动扩展容器!假设你突然需要增加你的应用;你只需要告诉deployment一个新的 pod 副本总数即可
    Kubernetes——基于容器技术的分布式架构领先方案,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩
    华为FusionSphere概述——计算资源、存储资源、网络资源的虚拟化,同时对这些虚拟资源进行集中调度和管理
  • 原文地址:https://www.cnblogs.com/xingchong/p/13074332.html
Copyright © 2011-2022 走看看