作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
<分区>
Joe Albahari 提供了一个 great explanation在他的 Threading in C# 电子书中介绍了 .NET 线程池的自动线程管理及其工作方式的原因。
据我了解,默认情况下,线程池在占用一个处理器的所有核心后,会延迟创建新线程,因为如果所有处理器核心都在忙于计算,创建新线程已无法再提高整体吞吐量(每秒完成的任务数),而新线程只会浪费系统资源。
但是,如果任务在线程池队列中停留的时间过长,线程池会假定池中的线程空闲或以某种方式阻塞,并尝试通过并发运行任务来利用停机时间。
在许多情况下,采用线程池线程具有表示“等待”状态的特殊属性的技术,而不是这种“延迟”算法是否更有意义?它可能看起来像这样:
System.Threading.Thread.CurrentThread.IsWaiting = true;
线程池会立即为排队的任务创建新线程,直到所有处理器内核都被非等待 线程占用。然后,任务将保留在队列中,直到线程完成或发出等待状态信号。
这会有几个好处。首先,如果处理器核心空闲,任务总是在它们排队到池中时立即启动,没有延迟。其次,在运行大量需要超过半秒才能完成的计算密集型任务的应用程序中,线程池不会继续使用不必要的额外线程给系统带来负担。
当然,可能会有一些情况,应用程序需要在严格的期限内完成任务,而不能等待其他任务先完成。该算法可能不适用于这些应用程序。否则,我认为它只会提高多线程应用程序的效率。
你怎么看?
我是一名优秀的程序员,十分优秀!