多線程(3)ThreadPool

来源:http://www.cnblogs.com/mcgrady/archive/2017/06/20/7055171.html
-Advertisement-
Play Games

使用Thread類已經可以創建並啟動線程了,但是隨著開啟的線程越來越多,線程的創建和終止都需要手動操作,非常繁瑣,另一個問題是,開啟更多新的線程但是沒有用的線程沒有及時得到終止的時候,會占用越來越多的系統資源,影響性能。 所以,.net為我們引入了ThreadPool(線程池),我們只需要把要執行的 ...


  使用Thread類已經可以創建並啟動線程了,但是隨著開啟的線程越來越多,線程的創建和終止都需要手動操作,非常繁瑣,另一個問題是,開啟更多新的線程但是沒有用的線程沒有及時得到終止的時候,會占用越來越多的系統資源,影響性能。

所以,.net為我們引入了ThreadPool(線程池),我們只需要把要執行的任務放到線程池中即可,線程的開啟包括資源的釋放都由線程池幫我們完成。下麵看一下怎麼使用線程池。

線程池ThreadPool

核心類:System.Threading.ThreadPool, 線程池受.Net CLR管理的,每一個CLR都有一個線程池實例。
每個進程都有一個線程池,線程池的預設大小為:每個可用的處理器有 25 個線程。使用 SetMaxThreads 方法可以更改線程池中的線程數。每個線程使用預設的堆棧大小並按照預設的優先順序運行。
ThreadPool類型擁有一個QueueUserWorkItem的靜態方法。該靜態方法接收一個委托,代表用戶自定義的一個非同步操作。在改方法被調用後,委托會進入到內部隊列中。如果線程池中沒有任何線程,將創建一個新的工作者線程(worker thread)並將隊列中的第一個委托放入到該工作者線程中。
如果向線程池中放入新的操作,當之前的所有操作完成後,很可能只需重用一個線程來執行這些新的操作。如果QueueUserWorkItem執行的頻率過快,線程池將創建更多的線程來執行這些新放入的非同步委托。
線程池中的線程數是有限的,如果沒有空閑的線程來執行這些非同步委托操作,這種情況下,新的非同步委托操作將線上程池的內部隊列中等待,直到線程池中年的工作者線程空閑(有能力)來執行。
當停止向線程池中放入新的非同步委托操作時,線程池會刪除一定事件後過期的不在使用的線程,同時釋放不再使用的系統資源。

線程池的使用非常簡單,如下代碼:

namespace ConsoleApplication18
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main thread starting...");

            //1,不帶參數
            ThreadPool.QueueUserWorkItem(AsyncAction);
            Thread.Sleep(TimeSpan.FromMilliseconds(3000));

            //2,帶參數
            ThreadPool.QueueUserWorkItem(AsyncAction, "Async state");
            Thread.Sleep(TimeSpan.FromMilliseconds(3000));

            //3,lambda表達式
            ThreadPool.QueueUserWorkItem(item => 
            {
                Console.WriteLine("Sub thread starting...");
                Console.WriteLine("Action state:" + item ?? string.Empty);
                Console.WriteLine(string.Format("Current thread id:{0}", Thread.CurrentThread.ManagedThreadId));
            }, "Lambda state");
            Thread.Sleep(TimeSpan.FromMilliseconds(3000));

            Console.WriteLine("Main thread completed!");
            Console.ReadKey();
        }

        /// <summary>
        /// 委托匹配方法
        /// </summary>
        /// <param name="obj"></param>
        static void AsyncAction(Object obj)
        {
            Console.WriteLine("Sub thread starting...");
            Console.WriteLine("Action state:" + obj ?? string.Empty);
            Console.WriteLine(string.Format("Current thread id:{0}", Thread.CurrentThread.ManagedThreadId));
        }

    }
}

 

輸出結果:

 

不適合使用線程池的場景

 使用線程池創建線程這麼簡單,然後性能又好,是不是以後創建線程都去使用線程池呢?答案是否定的。

那麼,以下場景是不適合使用線程池,而是自己創建並管理線程:

  1. 需要前臺線程時。因為線程池預設創建的都是後臺線程。
  2. 需要線程具有特定的優先順序。因為放到線程池中的線程都是由線程池來調度的,無法對其優先順序進行設置。
  3. 需要長時間運行的任務。由於線程池具有最大線程數限制,因此大量阻塞的線程池線程可能會阻止任務啟動。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在編程或是整理知識的時候一直苦於沒有一款可以幫助理清思路的工具。 在網上苦尋良久,終於找到了一款可心可意的小軟體 —— Graphviz。 折騰了一番,終於可以湊合著用了。 現將折騰的成果記錄於此以作備忘,當然如果能夠拋磚引玉那就再好不過了。 因為本人主要使用 Windows 以下將用 Window ...
  • ubuntn預設下載路徑的源是國外的下載很慢換成國內的下載路徑會好很多 在ubuntu應用搜索框(左上腳那個)中輸入software 1.software&Updates 應用點擊software 2.在彈出的界面中的download中選擇other 3.在之後彈出的框中選到china 4.在裡面選 ...
  • Shell腳本,就是利用Shell的命令解釋的功能,對一個純文本的文件進行解析,然後執行這些功能,也可以說Shell腳本就是一系列命令的集合。Shell可以直接使用在win/Unix/Linux上面,並且可以調用大量系統內部的功能來解釋執行程式,如果熟練掌握Shell腳本,可以讓我們操作電腦變得更 ...
  • awk [-field-separator] 'commands' input-file(s) ...
  • 在.Net框架中,如果您查看所有類型的的基類:System.Object類,將找到如下4個與相等判斷的方法: static Equals() virtual Equals() static ReferenceEquals() virtual GetHashCode() 除此之外,Microsoft已 ...
  • 配置的本質就是字元串的鍵值對,但是對於面向對象語言來說,能使用強類型的配置是何等的爽哉! 目錄 1. ASP.NET Core 配置系統 2. 強類型的 Options 3. Configure 方法 4. 源碼解析 ASP.NET Core 配置系統 在ASP.NET 4.X中,通常將配置存儲在 ...
  • C#編寫簡易的學生成績查詢 什麼是學生成績查詢系統? 使用C#語言編寫的一個可安裝的簡單CS系統,實現了用戶登錄,學生信息添加,成績修改,刪除,查詢等功能 開發環境 開發環境 visual studio2010(新版本2015,2017也可) visual studio2010(sql2008資料庫 ...
  • 背景:C# .Net MVC ,以及已經開發了近1年半的我,做了好久但是對於這個技術沒有總結,這是一個機會,寫寫我理解的東西吧。--以下內容參考了別人的文章 技術介紹: LINQ(Language Integrated Query,語言集成查詢)是一組用於C#和VB.NET語言的擴展,它允許編寫C# ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...