我讀了很多.Net資源,告訴我應該使用線程池線程,而不是自己實例化一個新線程。他們說你應該這樣做,因爲實例化一個新線程是一個昂貴的操作。線程創建過程中會發生什麼,使其成爲昂貴的操作?爲什麼創建一個新線程昂貴?
回答
一切都是相對的。創建一個新的線程是昂貴的...相對於不創建一個。如果你沒有在每個線程上做很多工作,涉及構建和拆除線程的工作可能會佔用你CPU時間的一部分。但是相對於創建一個新的進程而言,特別是在Windows上,這是很便宜的。
使用線程池通常更好,因爲它被調整爲幫助您避免一次激活太多的線程。你很少需要一次激活多個線程,否則你將花費大量的時間在它們之間執行上下文切換。使用線程池可以爲您管理這些,因爲在工作線程準備就緒之前,其他請求會排隊。
如果一個任務需要很長時間才能完成而不會阻塞,那麼使用線程池將避免必須分割太多線程中的CPU都想同時運行。但是,如果預計某個任務會阻塞,則應該將其作爲單獨的線程運行。 – supercat 2011-04-11 20:55:04
默認情況下,每個線程獲取1 MB的內存分配。這可能很快變得昂貴。
有幾個因素。提到的一個是堆棧的內存。由於堆棧內存不是由用於對象的普通GC分配器處理的,因此創建線程堆棧然後放棄堆棧與創建價值不大的堆對象並放棄它們非常不同。
尚未提及的另一個因素是與線程靜態變量等相關的成本。在一些需要所有線程靜態變量的系統中,一個線程可能會在線程啓動之前被定義,啓動一個新線程需要初始化所有的線程靜態變量。因爲.net允許線程動態添加線程靜態變量,所使用的數據結構是不同的。儘管如此,線程啓動時初始化這些數據結構並不是免費的。
線程池不僅是關於分攤線程創建和銷燬的成本,而且不僅僅是關於用較少的棧來節省內存。它的真正好處是避免了同時擁有太多活動線程,並且如果運行服務器應用程序,則最小化上下文切換。即使你沒有編寫服務器應用程序,threadpool只是一個比線程更好的抽象 - 開始異步操作,完成時得到通知,或完成時執行回調,並讓OS或運行時找出要創建的線程數。
- 1. 爲什麼創建一個新的線程比保持閒置更昂貴?
- 2. 爲什麼Tomcat的線程比後臺線程更昂貴?
- 3. 線程有多昂貴?
- 4. 創建com.rits.cloning.Cloner是否昂貴?
- 5. 爲什麼類型檢查昂貴?
- 6. 爲什麼試塊價格昂貴?
- 7. 爲什麼File.Open如此昂貴?
- 8. 爲什麼System.Drawing.Rectangle.getWidth()如此昂貴?
- 9. 爲什麼類型轉換昂貴?
- 10. SQL爲什麼會變得昂貴?
- 11. 爲什麼Wpf的DrawingContext.DrawText如此昂貴?
- 12. 爲什麼alpha混合如此昂貴?
- 13. 昂貴的包裝System.Numerics.VectorX - 爲什麼?
- 14. 關於創建昂貴的WPF對象和多線程
- 15. Java(Solr)線程轉儲有多昂貴?
- 16. 正在創建一個WCF服務主機一個昂貴的過程?
- 17. 創建一個Nokogiri :: XML :: Builder對象是一個昂貴的過程?
- 18. 注入創建昂貴的服務
- 19. 正在創建HttpClient昂貴嗎?
- 20. 什麼更昂貴?每次數據更改或更新現有的ArrayAdapter時,都會創建一個新的ArrayAdapter?
- 21. 爲什麼autorelease對iPhone應用程序特別危險/昂貴?
- 22. 它創建一個NSAutoreleasePool的代價有多昂貴
- 23. RabbitMQ創建連接是一個昂貴的操作
- 24. 什麼是GCC昂貴的優化?
- 25. 什麼更昂貴?作業或聲明?
- 26. 陣列優化:什麼更昂貴?
- 27. 使用Oracle Coherence,創建新的NamedCache有多昂貴?
- 28. 爲什麼Elasticsearch服務提供商那麼昂貴?
- 29. 昂貴的StaticResource
- 30. 爲什麼浮點操作被認爲是昂貴的?
那麼,一方面,運行時爲新線程的堆棧空間分配1 MB的內存...... – 2011-04-11 20:01:06