ThreadPool

一:Thread是CLR表示线程的数据结构

二:ThreadPool线程池

  • Thread:做一个异步任务,就需要开启一个Thread.[专有性]
  • ThreadPool:想做异步任务,打个比方,租车公司:租完车需要归还。

三:ThreadPool的使用方式

1
2
3
4
5
6
ThreadPool.QueueUserWorkItem((obj)=> {
var func = obj as Func<string>;
Console.WriteLine("我是工作线程:{0},content={1}",Thread.CurrentThread.ManagedThreadId,func());
},new Func<string>(()=>"Hello World"));

Console.WriteLine("主线程ID:{0}",Thread.CurrentThread.ManagedThreadId);

四:Thread和ThreadPool到底多少区别

1.如果现在有10个任务:

  • Thread:需要开启10个任务
  • Thread:10个任务放进线程池

2.区别

Thread:

线程数量:12个,未启动线程:0个,后台线程:1个,待处理线程:0个,死线程:10个。

XXXX表示线程死了,会进到终结器,GC会在下一次回收,会占用1M的堆栈空间。

执行命令:

!FinalizeQueue

可以看到有11线程进入终结器

ThreadPool:

ThreadCount:一共有6个线程,一个主线程,一个寄存器,4个工作线程

Cpu利用率30%,工作线程数量4个,在运行的线程为0,空闲的线程是4个,最大的线程是2047,最小的是4个

工作线程的队列是0个

IO线程端口线程0个,空闲0个,最大空闲8个,最大线程1000个,最小线程4个。

当前ThreadPool中,有“工作线程”和“IO线程”

工作线程:给一般的异步任务执行的。其中 不涉及网络,文件等IO操作。【开发调用】

IO线程:一般用在文件和网络IO上。【CLR调用】

3.总结

1.ThreadPool可以用8个线程解决10个线程干的事情:

节省了空间和时间:

时间:通过各个托管和非托管的dll

空间:teb,osthread结构,堆栈