zoukankan      html  css  js  c++  java
  • c# AutoResetEvent 信号灯 用于线程池状态控制

    c# AutoResetEvent 信号灯 用于线程池状态控制

    我们在线程编程的时候往往会涉及到线程的通信,通过信号的接受来进行线程是否阻塞的操作。

    AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

    AutoResetEvent 的方法有很多,具体方法和扩展方法请详见AutoResetEvent类,最常用方法中就有Set()和WaitOne()。

    我们构造一个信号灯。

    static AutoResetEvent myResetEvent = new AutoResetEvent(false);
    

      

    想要监控线程的状态,通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号WaitOne是等待信号,只有发了信号,才可以进行等待的查询。

    public class Program
    {
        const int cycleNum = 10;
        static AutoResetEvent myEvent = new AutoResetEvent(false);
        static void Main(string[] args)
        {
            ThreadPool.SetMinThreads(1, 1);
            ThreadPool.SetMaxThreads(5, 5);
            for (int i = 1; i <= cycleNum; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(testFun), i.ToString());
            }
            Console.WriteLine("主线程执行!");
            Console.WriteLine("主线程结束!");
            myEvent.WaitOne();
            Console.WriteLine("线程池终止!");
            Console.ReadKey();
        }
        public static void testFun(object obj)
        {
            Console.WriteLine(string.Format("{0}:第{1}个线程", DateTime.Now.ToString(), obj.ToString()));
            Thread.Sleep(5000);
            if (obj.ToString() == cycleNum.ToString())
            {
                myEvent.Set();
            }
        }
    }
    

      

  • 相关阅读:
    Druid.io系列(三): Druid集群节点
    Druid.io系列(二):基本概念与架构
    Druid.io系列(一):简介
    am335x backlight
    imx6 fec分析
    imx6 ar8031 千兆网卡不能用
    imx6 spi分析
    imx6 i2c分析
    imx6 uart分析
    imx6 gpio分析
  • 原文地址:https://www.cnblogs.com/xujie520/p/14760188.html
Copyright © 2011-2022 走看看