线程学习4——线程池

线程池

    创建线程是需要时间的。许多应用程序使用多个线程,但这些线程经常在休眠状态中耗费大量的时间来等待事件发生。

    为了简化对这些线程的管理,.NET框架为每一个进程提供了一个线程池,使应用程序能够根据需要来有效地利用多个线程。

    线程池线程都是后台线程。每个线程都使用默认堆栈大小,以默认的优先级运行,并处于多线程单元中。

    ThreadPool类会在需要时增减池中线程的个数,直到最大的线程数。线程的数目永远不会超过最大值。超过最大值的其他线程可以排队,但它们要等到其他线程完成后才启动。

    池中的最大线程数是可配置的,也可以指定在创建线程池时立即启动的最小线程数。在双核CPU中,默认设置为50个工作线程和1000个I/O线程。

使用线程池的环境:

     线程池特别适合于执行一些需要多个线程的任务。使用线程池能够优化这些任务的执行过程,从而提高吞吐量,

它不仅能够使系统针对此进程优化该执行过程,而且还能够使系统针对计算机上的其他进程优化该执行过程。

     如果需要启动多个不同的任务,而不想分别设置每个线程的属性,则可以使用线程池。

不适合线程池的情况:

     如果应用程序需要对线程进行特定的控制,则不适合使用线程池,需要创建并管理自己的线程。不适合使用线程池的情形包括:

— 如果需要使一个任务具有特定的优先级。

— 如果具有可能会长时间运行(并因此阻塞其他任务)的任务。

— 如果需要将线程放置到单线程单元中(线程池中的线程均处于多线程单元中)。

— 如果需要用永久标识来标识和控制线程,比如想使用专用线程来中止该线程,将其挂起或按名称发现它。

线程池的限制:

      线程池中的所有线程都是后台线程。如果进程中的所有前台线程都结束了,所有的后台线程就会停止。不能把线程池中的线程改为前台线程。

      不能给线程池中的线程设置优先级或名称。

      对于COM对象,线程池中的所有线程都是多线程单元线程。许多COM对象都需要单线程单元线程。

      线程池中的线程只能用于时间较短的任务。如果线程要一直运行(如Word的拼写检查器线程),就应该使用Thread类创建一个线程。

线程池的基本使用方法:

      System.Threading.ThreadPool 类实现了线程池。ThreadPool类是一个静态类,它提供了管理线程池的一系列方法。

      ThreadPool.QueueUserWorkItem 方法在线程池中创建一个线程池线程来执行指定的方法(用委托WaitCallback来表示),并将该线程排入线程池的队列等待执行。

      QueueUserWorkItem方法的原型为:

      public static Boolean QueueUserWorkItem(WaitCallback wc, Object state);

      public static Boolean QueueUserWorkItem(WaitCallback wc);

      这些方法将“工作项”(和可选状态数据)排列到线程池的线程中,并立即返回。工作项只是一种方法(由wc参数标识),它被调用并传递给单个参数,即状态(状态数据)。

      没有状态参数的QueueUserWorkItem版本将null传递给回调方法。线程池中的某些线程将调用 System.Threading.WaitCallback委托表示的回调方法来处理该工作项。

      回调方法必须与 System.Threading.WaitCallback委托类型相匹配。WaitCallback定义如下:

      public delegate void WaitCallback(Object state);

      调用QueueUserWorkItem时传入的Object类型参数将传递到任务过程,可以通过这种方式来向任务过程传递参数。

      如果任务过程需要多个参数,可以定义包含这些数据的类,并将类的实例强制转换为Object数据类型。

      每个进程都有且只有一个线程池。当进程启动时,线程池并不会自动创建。当第一次将回调方法排入队列(比如调用ThreadPool.QueueUserWorkItem方法)时才会创建线程池。

      通过使用ThreadPool.GetMaxThreads和ThreadPool.SetMax Threads方法,可以获取和设置线程池的最大线程数。

      使用 ThreadPool.GetMinThreads和ThreadPool.SetMinThreads方法可以获取和设置线程池所维持的空闲线程数。

      即使是在所有线程都处于空闲状态时,线程池也会维持最小的可用线程数,以便队列任务可以立即启动。将终止超过此最小数目的空闲线程,以节省系统资源。

      默认情况下,每个处理器维持一个空闲线程。

线程池示例:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值