开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2020.11.17
多线程之旅(1)_线程同步之AutoResetEvent和ManualResetEvent的区别、用法——附C#源码示例
多线程之旅(2)_创建一个属于自己的精简线程池_线程调度策略——附C#源码
多线程之旅(3)_如何使用lock()来实现对象和代码块的加锁功能(详解)
多线程之旅(4)_async/await的用法精细详解
多线程之旅(5)_眼花缭乱的sleep,wait,yield,join,Abort,ContinueWith,RunSynchronously,background方法详解
多线程之旅(6)_Semaphore和SemaphoreSlim关于WaitOne、Release的用法详解——附C#源码
多线程之旅(7)_Task和Thread有参无参,有、无返回值,的28种调用方式汇总——附C#源码
多线程之旅(8)_Task的异常捕获和处理方法——附C#源码
多线程之旅(9)_如何安全的取消正在执行的线程——附C#源码
多线程之旅(10)_QueueUserWorkItem和UnsafeQueueUserWorkItem的区别
多线程之旅(11)_如何限制系统线程池ThreadPool的最大最小并发数量_SetMaxThreads/SetMinThreads用法
多线程之旅(12)_聊聊线程池在系统内部运转的基本原理
补充 以下两篇文章中的知识点:
上述两篇文章分别讲了线程池和ThreadPool.SetMinThreads(*, *);的用法,改方法可以设置线程池中最小线程数量,但是没有说明具体应用场景。
我们在生产环境中使用线程池时,会发现一个问题,在默认情况下虽然我们使用了线程池,设置了线程池并发数量,但是从线程池创建线程的过程十分缓慢。
比如我们设置线程池中并发数量为20,实际情况是,可能从第5个线程开始,程序每1s创建一个新线程,直到并发数量达到20个才停下来。从逻辑上说是没有问题的,因为此时系统中并发的线程确实达到了20个。但假如我们有1000个线程,每个线程实际执行时间只有0.001秒,1000个线程总执行时间为1s,然而将这1000个线程创建出来,则需要1000s,这种场景中线程池就没有意义了。
我们希望的场景是,当程序启动时,瞬间创建出20个线程,每当这20个线程有一个执行完成时,立刻创建出一个新的线程补上,而不再有时间间隔。这种情况下1000个线程总执行时间大约就在1s左右。
基于上述这个场景,我们就可以使用ThreadPool.SetMinThreads(*, *)来达到这个目的。
相关测试比较代码见GitHub地址:https://github.com/yangwohenmai/TEST/tree/master/TaskSchedulerTest
微信登录中...请勿关闭此页面