一:Thread是CLR表示线程的数据结构
二:ThreadPool线程池
- Thread:做一个异步任务,就需要开启一个Thread.[专有性]
- ThreadPool:想做异步任务,打个比方,租车公司:租完车需要归还。
三:ThreadPool的使用方式
1 | ThreadPool.QueueUserWorkItem((obj)=> { |
四: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结构,堆栈