搞懂线程池(一)

创建线程是一个很代价很高的操作,每个异步操作创建线程都会对 CPU 产生显著的性能影响。为了解决这个问题我们引入了线程池的概念,所谓的线程池就是我们提前分配一定的资源,把这些资源放在资源池中,每次需要用到的使用从里面取出一个,用完后再放回去。线程池一般用在需要创建大量的短暂的且开销大的资源里。.NET 中的线程池位于 System.Threading.ThreadPool 类,它接受 CLR 的管理。 ThreadPool 类中拥有一个 QueueUserWorkItem 方法,该方法为静态方法。它接受一个委托,表示用户定义的异步操作。在方法被调用后,委托会进入到内部队列中。如果池中没有任何线程,将创建一个新的 Worker Thread (工作者线程)并将队列中第一个委托放入到该 Work Thread 中。
这里有一点要注意,当有新的操作加入到线程池里时,如果之前的操作完成了,那么这个新的操作将会重用线程来执行。但是如果新的操作加入线程池的太快太多,那么线程池将会创建更多的线程来执行操作。然后创建的线程数量是有限制的,达到限制的数量后,以后加进来的操作将会在队列中等待线程被放回线程池并有能力执行它们。当没有任何操作进入线程池中时,线程池会释放掉超过过期时间的线程,以减少操作系统和 CPU 的压力。

Tip:

  1. 一定不要在线程池中放入长时间运行的操作或者放入会阻塞线程的操作,这样会导致严重的性能问题和莫名其妙的bug。
  2. 线程池中的所有线程都是后台线程,当应用程序中的所有前台线程完成后后台线程也就停止工作,即使它还没有完成所作的工作。

零、 线程池中的 APM 和委托

所谓 APM 是异步编程模型,他是一种模式,该模式允许用更少的线程去做更多的操作,.NET Framework 很多类也实现了该模式。我们也可以在自定义的类中实现返回类型为 IAsyncResult 接口的 BeginXXX 方法 和 EndXXX 方法 。委托类型也定义了 BeginInv

猜你喜欢

转载自blog.csdn.net/gangzhucoll/article/details/103652075
今日推荐