什么是線程池


概述

  到目前為止我們使用多線程應用程序的目的是盡可能多地使用計算機處理器資源。所以,看起來我們僅需要為每個獨立的任務分配一個不同的線程,並讓處理器確定在任何時間它總會處理其中的某一個任務。額,對小系統來說這樣做很好。但是當系統越來越復雜時,線程的數量也會越來越多,操作系統將會花費更多時間處理鎖分配,理清線程之間的關系,處理程序指令的時間實際上是很少的。為了讓我們的程序具備可擴展性,我們將不得不對線程進行一些控制。

  對那些生存周期比較短的線程來說,使用線程池來處理任務要比為每個任務都創建一個線程然后順序地回收它們要高效得多。一個任務,在概念上說,可以是一個單一方法的執行過程或者一系列方法的執行過程。為一個線程預分配一個集合或者一個池來以備未來之需以及能夠在一個應用程序中重用的技術稱作線程池

  這一章主要對線程池進行詳細地介紹,主要覆蓋以下主題:

  1. 什么是線程池?

  2. 為什么需要線程池?

  3. 線程池的概念。

  4. 線程池中CLR 的角色。

  5. 線程池的缺陷以及它們的解決方案。

  6. 一個線程池的大小。

  7. 探討.NET ThreadPool 類。

  8. 使用C# 語言編寫線程池相關應用。

  你將發現.NET Framework 中通用語言運行時在線程池技術中起到了很重要的作用。

什么是線程池?

  線程池是指在初始化一個多線程應用程序過程中創建一個線程集合,然后在需要執行新的任務時重用這些線程而不是新建一個線程。線程池中線程的數量通常完全取決於可用內存數量和應用程序的需求。然而,增加可用線程數量是可能的。線程池中的每個線程都有被分配一個任務,一旦任務已經完成了,線程回到池子中並等待下一次分配任務。

為什么需要線程池?

  基於以下幾個原因在多線程應用程序中使用線程是必須的:

  1. 線程池改進了一個應用程序的響應時間。由於線程池中的線程已經准備好且等待被分配任務,應用程序可以直接拿來使用而不用新建一個線程。

  2. 線程池節省了CLR 為每個短生存周期任務創建一個完整的線程的開銷並可以在任務完成后回收資源。

  3. 線程池根據當前在系統中運行的進程來優化線程時間片。

  4. 線程池允許我們開啟多個任務而不用為每個線程設置屬性。

  5. 線程池允許我們為正在執行的任務的程序參數傳遞一個包含狀態信息的對象引用。

  6. 線程池可以用來解決處理一個特定請求最大線程數量限制問題。

線程池的概念

  影響一個多線程應用程序的相應時間的幾個主要因素之一是為每個任務生成一個線程的時間。

  例如,一個Web Server 是一個多線程應用程序,它可以同時對多個客戶端請求提供服務。讓我們假設有十個客戶端同時訪問Web Server:

  1. 如果服務執行一個客戶端對應一個線程的策略,它將為這些客戶端生成十個新線程,從創建第一個線程開始到在線程的整個生命周期管理它們都會增加系統開銷。也有可能在某個時間計算機的資源耗盡。

  2. 相反的,如果服務端使用一個線程池來處理這些請求,那么當每次客戶端請求來到后都創建一個線程的時間會節省下來。它可以管理已經創建的線程,如果線程池太忙的話也可以拒絕客戶端請求。這是線程池背后的概念。

  .NET CLR 為服務請求維護一個線程池。如果我們的應用程序從線程池中請求一個新線程,CLR 將試着從線程池中取出一個。如果線程池是空的,它將生成一個新線程並把它給我們。當我們的代碼使用的線程結束以后,線程由.NET 回收並返回給線程池。線程池中線程的數量由當前可用地內存數量決定。

  現在回顧一下,影響設計一個多線程應用程序的因素有:

  1. 一個應用程序的響應時間。

  2. 線程管理資源的分配。

  3. 資源共享。

  4. 線程同步。

  應用程序的響應時間和資源共享在本章的線程池部分介紹。其他因素已經由本書的之前章節介紹過了。

 

下一篇介紹CLR 和線程…


作者:DanielWise 
出處:http://www.cnblogs.com/danielWise/ 
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM