应用Thread类早已能够建立并起动线程了,可是伴随着打开的线程愈来愈多,线程的建立和停止都必须手动式实际操作,十分繁杂,另一个难题是,打开大量新的线程可是没有用的线程沒有立即获得停止的情况下,会占有愈来愈多的服务器资源,危害特性。

因此 ,.net为大家导入了ThreadPool(线程池),大家只必须把要实行的每日任务放进线程池中就可以,线程的打开包含資源的释放出来都由线程池帮大家进行。下边看一下如何使用线程池。

线程池ThreadPool

关键类:System.Threading.ThreadPool, 线程池受.Net CLR管理方法的,每一个CLR都是有一个线程池案例。
每一个过程都是有一个线程池,线程池的默认设置尺寸为:每一个能用的CPU有 25 个线程。应用 SetMaxThreads 方式能够变更线程池中的线程数。每一个线程应用默认设置的局部变量尺寸并依照默认设置的优先运作。
ThreadPool种类有着一个QueueUserWorkItem的静态方法。该静态方法接受一个授权委托,意味着客户自定的一个多线程实际操作。在改方式被启用后,授权委托会进到到內部序列中。假如线程池中沒有一切线程,将建立一个新的工作人员线程(worker thread)并将序列中的第一个授权委托放进到该工作人员线程中。
假如向线程池中放进新的实际操作,当以前的全部实际操作进行后,很可能只需器重一个线程来实行这种新的实际操作。假如QueueUserWorkItem实行的頻率过快,线程池将建立大量的线程来实行这种新放进的多线程授权委托。
线程池中的线程数是比较有限的,要是没有空余的线程来实行这种多线程授权委托实际操作,这类状况下,新的多线程授权委托实际操作将在线程池的內部序列中等候,直至线程池中老年的工作人员线程空余(有工作能力)来实行。
当终止向线程池中放进新的多线程授权委托实际操作时,线程池会删掉一定恶性事件后到期的没有应用的线程,另外释放出来已不应用的服务器资源。

线程池的应用比较简单,以下编码:

namespace ConsoleApplication18
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main thread starting...");

            //1,没有主要参数
            ThreadPool.QueueUserWorkItem(AsyncAction);
            Thread.Sleep(TimeSpan.FromMilliseconds(3000));

            //2,带主要参数
            ThreadPool.QueueUserWorkItem(AsyncAction, "Async state");
            Thread.Sleep(TimeSpan.FromMilliseconds(3000));

            //3,lambda关系式
            ThreadPool.QueueUserWorkItem(item => 
            {
                Console.WriteLine("Sub thread starting...");
                Console.WriteLine("Action state:"   item ?? string.Empty);
                Console.WriteLine(string.Format("Current thread id:{0}", Thread.CurrentThread.ManagedThreadId));
            }, "Lambda state");
            Thread.Sleep(TimeSpan.FromMilliseconds(3000));

            Console.WriteLine("Main thread completed!");
            Console.ReadKey();
        }

        /// <summary>
        /// 授权委托搭配方式
        /// </summary>
        /// <param name="obj"></param>
        static void AsyncAction(Object obj)
        {
            Console.WriteLine("Sub thread starting...");
            Console.WriteLine("Action state:"   obj ?? string.Empty);
            Console.WriteLine(string.Format("Current thread id:{0}", Thread.CurrentThread.ManagedThreadId));
        }

    }
}

 

輸出結果:

 

不宜应用线程池的情景

 应用线程池建立线程那么简易,随后特性又好,是否之后建立线程都去应用线程池呢?回答是否认的。

那麼,下列情景是不宜应用线程池,只是自身建立并管理方法线程:

  1. 必须前台接待线程时。由于线程池默认设置建立的全是后台管理线程。
  2. 必须线程具备特殊的优先。由于放进线程池中的线程全是由线程池来生产调度的,没法对其优先开展设定。
  3. 必须长期运作的每日任务。因为线程池具备较大 线程数限定,因而很多堵塞的线程池线程很有可能会阻拦每日任务起动。