我读了很多。net资源告诉我,我应该使用线程池线程,而不是自己实例化一个新线程。他们说你应该这样做,因为实例化一个新线程是一个昂贵的操作。在线程创建过程中发生了什么,使它成为一个昂贵的操作?
一切都是相对的。创建一个新线程是很昂贵的…相对于不创造一个。如果您没有为每个线程做很多工作,那么构建和删除线程所涉及的工作可能会占用cpu时间的很大一部分。但相对于创建一个新进程来说,这是很便宜的,尤其是在Windows系统上。
通常使用线程池也更好,因为它被调优以帮助您避免一次有太多的活动线程。您很少希望一次活动的线程数量超过几个,否则您将花费大量cpu时间在它们之间执行上下文切换。使用线程池为您管理这一点,因为额外的请求将排队,直到一个工作线程准备好。
每个线程默认分配1 MB内存。这很快就会变得很贵。
有几个因素。其中一个提到的是堆栈的内存。因为堆栈内存不是由用于对象的普通GC分配器处理的,所以创建线程的堆栈然后放弃它与创建价值兆的堆对象并放弃它们是非常不同的。
另一个尚未提及的因素是与线程静态变量相关的成本。在某些系统中,要求在线程启动之前定义线程可能使用的所有线程静态变量,启动一个新线程将需要初始化所有线程静态变量。因为。net允许线程动态地添加线程静态变量,所以使用的数据结构是不同的。然而,在线程启动时初始化这些数据结构并不是免费的。
Threadpool不仅仅是为了平摊线程创建和销毁的成本,也不仅仅是为了用更少的堆栈节省内存。它的真正好处是避免同时有太多活动线程,并且在运行服务器应用程序时最大限度地减少上下文切换。即使你不编写服务器应用程序,线程池也只是一个比线程更好的抽象——启动异步操作,完成时获得通知,或完成时执行回调,并让操作系统或运行时计算创建多少线程。