C#多线程之线程池(ThreadPool)

 

一、简介

前面介绍了平时用到的大多数的多线程的例子,但在实际开发中使用的线程往往是大量的和更为复杂的,这时,每次都创建线程、启动线程。从性能上来讲,这样做并不理想(因为每使用一个线程就要创建一个,需要占用系统开销);从操作上来讲,每次都要启动,比较麻烦。为此引入的线程池的概念。

好处:

  • 1.减少在创建和销毁线程上所花的时间以及系统资源的开销
  • 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。

在什么情况下使用线程池?

  • 1.单个任务处理的时间比较短
  • 2.需要处理的任务的数量大

线程池最多管理线程数量=“处理器数 * 250”。也就是说,如果您的机器为2个2核CPU,那么CLR线程池的容量默认上限便是1000。通过线程池创建的线程默认为后台线程,优先级默认为Normal。

 

二、代码

案例一:

    class Program
  {
      static void Main(string[] args)
      {
          ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod1), new object());    //参数可选
          Console.ReadKey();
      }

      public static void ThreadMethod1(object val)
      {
          for (int i = 0; i <= 10000; i++)
          {
              if (i % 1000 == 0)
              {
                  if (string.IsNullOrEmpty(Thread.CurrentThread.Name) )
                  {
                      Thread.CurrentThread.Name = "Thred_" + i;
                  }
                  Console.WriteLine("循環{0}次的線程的線程名稱為:{1}",i,Thread.CurrentThread.Name);
              }
          }
      }
  }

运行结果:

案例二:

    class Program
  {
      public static void Main()
      {
          // Queue the task.
          ThreadPool.QueueUserWorkItem(ThreadProc);
          Console.WriteLine("Main thread does some work, then sleeps.");
          Thread.Sleep(1000);

          Console.WriteLine("Main thread exits.");
          Console.ReadKey();
      }

      // This thread procedure performs the task.
      static void ThreadProc(Object stateInfo)
      {
          // No state object was passed to QueueUserWorkItem, so stateInfo is null.
          Console.WriteLine("Hello from the thread pool.");
      }
  }

运行结果:

关于C#多线程之线程池(ThreadPool)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程宝库

 多线程经常访问同一资源可能造成什么问题竞态条件和死锁如果两个或多个线程访问相同的对象,或者访问不同步的共享状态 ,就会出现竞态条件;为了避免出现该问题,可以锁定共享的对象。但是过多的 ...