• 线程的控制和线程池


    一.WaitHandle:

        ”.Net 中提供了一些线程间更自由通讯的工具,他们提供了通过"信号"进行通讯的机制

    可以通过ManualResetEvent,AutoResetEvent(他是在开门并且一个 WaitOne 通过后自动关门)来进行线程间的通讯

      • waitOne:    等待开门
      • Set:           开门
      • Reset:       关门
    static void Main(string[] args)
    {
        ManualResetEvent mre = new ManualResetEvent(false);//构造函数 false 表示“初始状态为关门”,设置为 true 则初始化为开门状态
        Thread thread = new Thread(() =>
        {
            Console.WriteLine("开始等着开门");
            mre.WaitOne();           //这里程序就等着开门
            Console.WriteLine("终于开门了");
        });
        thread.Start();
        Console.WriteLine("按任意键开门");
        Console.ReadKey();
        mre.Set();//开门
        Console.ReadKey();
    }

        mre.WaitOne(5000)                           //还可以设置等待超时时间:返回true或false

        WaitHandle.WaitAll(WaitHandle[] waitHandles)            //用来等待所有信号都变为“开门状态”

        WaitHandle.WaitAny(WaitHandle[] waitHandles)                //用来等待任意一个信号都变为“开门状态”

    二.线程池:

        每次创建线程、销毁线程都比较消耗 cpu 资源,因此可以通过线程池进行优化。线程池是一组已经创建好的线程,随用随取,用完了不是销毁线程,然后放到线程池中,供其他人用

      ThreadPool 类的一个重要方法:

        static bool QueueUserWorkItem(WaitCallback callBack, object state)      //第二个重载是用来传递一个参数给线程代码的

     1 static void Main(string[] args)
     2 {
     3     for (int i = 0; i < 20; i++)
     4     {
     5         ThreadPool.QueueUserWorkItem(obj => {
     6             Console.WriteLine("i="+obj);
     7                 
     8         },i);
     9     }
    10     for (int i = 0; i < 20; i++)
    11     {
    12         Console.WriteLine("hello");
    13     }
    14     Console.ReadKey();
    15 }
    线程池的使用
  • 相关阅读:
    Linux下select调用引发的血案
    http://www.regexlab.com/zh/regref.htm
    TPL: 一个新的C++正则表达式(regex)库
    Kerneloops为Linux用户与开发人员搭建“oops”报告提交桥梁
    LINUX同步软件rsync原理
    Oops错误
    C03Java同步实践加强班第9周上机任务
    C03Java同步实践加强班第8周上机任务
    关于读书:读XX书是否为时过早,是否有意义
    C++程序设计第八周上机实践项目
  • 原文地址:https://www.cnblogs.com/fengxuehuanlin/p/7560446.html
Copyright © 2020-2023  润新知