zoukankan      html  css  js  c++  java
  • C# ManualResetEvent 类的用法

    以下是学习笔记记录

    转自:https://www.cnblogs.com/xingchong/p/13074332.html

    https://www.pianshen.com/article/908728804/

    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();//如果没有可消费的产品,即无信号,则会阻塞
                    }
                }
            }
        }
    }
    

      

  • 相关阅读:
    剑指offer-面试题11-旋转数组的最小数字-二分法
    剑指offer-基础练习-快速排序-排序
    剑指offer-面试题10-斐波那契数列-递归循环
    剑指offer-面试题9-用两个栈实现队列-栈和队列
    剑指offer-面试题8-二叉树的下一个节点-二叉树
    剑指offer-面试题7-重建二叉树-二叉树
    Android手势识别总结
    Android点击Button按钮的四种事件监听方法总结
    Android点击EditText文本框之外任何地方隐藏键盘的解决办法
    spring boot 热部署
  • 原文地址:https://www.cnblogs.com/baozi789654/p/14843659.html
Copyright © 2011-2022 走看看