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方法将对应的任务添加到线程池中。线程池会从队列中提取任务,并且将其委派给线程池中的线程执行。
浙公网安备 33010602011771号