zoukankan      html  css  js  c++  java
  • C# 多线程 线程池(ThreadPool) 2 如何控制线程池?

    线程池启动了,但是没有方法去控制线程池,如果子线程出现了问题,难道线程池就死了吗?

    我们可以设置线程池的线程数量,进行加入任务,线程池会自动分配并且合理的执行,但是控制不了又有啥意思呢。

    线程池里线程的执行不影响主线程的运行的。

    线程池中有一个东西叫做 信号灯 下面是一个例子:

     

    1. public class Program
    2. {
    3.     const int cycleNum = 10;
    4.     static AutoResetEvent myEvent = new AutoResetEvent(false);
    5.     static void Main(string[] args)
    6.     {
    7.         ThreadPool.SetMinThreads(1, 1);
    8.         ThreadPool.SetMaxThreads(2, 2);
    9.         for (int i = 1; i <= cycleNum; i++)
    10.         {
    11.             ThreadPool.QueueUserWorkItem(new WaitCallback(testFun), i.ToString());
    12.         }
    13.         Console.WriteLine("主线程执行!");
    14.         Console.WriteLine("主线程结束!");
    15.         Console.WriteLine("阻塞");
    16.         myEvent.WaitOne();
    17.         Console.WriteLine("线程池终止!");
    18.         Console.ReadKey();
    19.     }
    20.     public static void testFun(object obj)
    21.     {
    22.         Console.WriteLine(string.Format("{0}:第{1}个线程", DateTime.Now.ToString(), obj.ToString()));
    23.         Thread.Sleep(5000);
    24.         if (obj.ToString() == cycleNum.ToString())
    25.         {
    26.             Console.WriteLine("终止了");
    27.             myEvent.Set();
    28.         }
    29.     }
    30. }
    复制代码





    代码的信号灯的作用,当任务全部投放在线程池中,我们开启了阻塞线程池。

    之后,我们又在执行的函数中,添加了代码,也就是


    1. if (obj.ToString() == cycleNum.ToString())
    2.         {
    3.             Console.WriteLine("终止了");
    4.             myEvent.Set();
    5.         } 


    很明显,我们判断了当前执行的数量以及我们项目的总数量。如果达到总数量,则代表线程池已经执行完毕,我们可以监控他是否完毕,

    当代码:myEvent.WaitOne(); 执行了,它不仅阻塞,他会等待。等到我们的myEvent.Set(); 信号发出之后,即可恢复继续执行。

  • 相关阅读:
    JAVA中循环删除list中元素的方法总结
    弹力设计总结
    CPU飚高问题排查基本步骤
    缓存数据库更新策略
    .Module高内聚低耦合的思考
    javascript回调函数及推论
    Laravel Autoloader模块分析
    Laravel Event模块分析
    数据操作分层设计
    Discuzx2开发标准流程
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7842762.html
Copyright © 2011-2022 走看看