using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Thread与ThreadPool对比
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();//启动计时器
            for (int i = 0; i < 1000; i++)//循环创建1000个线程
            {
                Thread NewThread = new Thread(() => {
                    int cnt = 0;
                    cnt++;//任意执行的一个动作
                });
                NewThread.Start();
            }          
            sw.Stop();//停止记时器
            Console.WriteLine("创建1000个Thread线程的时间:"+sw.ElapsedMilliseconds+"ms");//读出1000个线程创建所用的时间ms
            sw.Restart();//归0记时器
 
            sw.Start();//再启动记时器。
            for (int i = 0; i < 1000; i++)
            {
                ThreadPool.QueueUserWorkItem((s)=> {
                    int cnt = 0;
                    cnt++;//任意执行的一个动作
                });
                sw.Stop();//停止记时器
            }
            Console.WriteLine("用线程池执行1000个线程用时:" + sw.ElapsedMilliseconds+"ms");//读出1000线程在线程池中运行所用的时间
            Console.ReadKey();
        }
    }
}

 

运行结果:

 

 

        使用 ThreadStart 和 ParameterizedThreadStart 创建线程还是比较简单的,但是由于线程的创建和销毁需要耗费一定的开销,过多的使用线程反而会造成内存资源的浪费,从而影响性能,出于对性能的考虑,于是引入了线程池的概念。线程池并不是在 CLR 初始化的时候立刻创建线程的,而是在应用程序要创建线程来执行任务的时候,线程池才会初始化一个线程,初始化的线程和其他线程一样,但是在线程完成任务之后不会自行销毁,而是以挂起的状态回到线程池。当应用程序再次向线程池发出请求的时候,线程池里挂起的线程会再度激活执行任务。这样做可以减少线程创建和销毁所带来的开销。线程池建立的线程默认为后台线程。每个线程要消耗1M内存。

         简单说:线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。线程池非常适合大量小的运算。当应用程序想要执行一个异步操作时,需要调用QueueUserWorkItem方法将对应的任务添加到线程池中。线程池会从队列中提取任务,并且将其委派给线程池中的线程执行。

 

posted on 2022-06-12 15:53  sbwynnss  阅读(136)  评论(0编辑  收藏  举报