目錄
一.線程類
1.基礎線程類(Thread)
2.線程池類(Threadpool)
3.任務并行庫(Task)
4.并行循環(Parallel)
二.線程池(threadPool)和Thread/Task之間的聯系
1.ThreadPool和Thread的關系
2.ThreadPool和Task的關系
三.Thread和task的區別
1.抽象層次不同
2.資源消耗和效率
四.什么是操作系統資源/線程資源?
1.操作系統資源
2.線程資源
一.線程類
1.基礎線程類(Thread)
Thread類:最基礎的線程操作類,可以直接創建和控制單個線程。
特點:輕量級,但是創建和銷毀成本比較高,適合長時間運行的任務。
使用場景:需要精細控制線程(如:優先級,長事件運行)
2.線程池類(Threadpool)
ThreadPool類:管理一個線程池,用于復用線程執行短期任務,減少線程創建銷毀的開銷。
特點:自動管理線程聲明周期,適合大量短期任務。
使用場景:執行大量短期任務;
常用方法:
ThreadPool.QueueUserWorkItem(DoWork, "參數");
//將任務加入線程池隊列
3.任務并行庫(Task)
Task類:基于線程池的高級抽象,提供更靈活的任務管理和異步操作。
特點:支持任務調度,延續操作,取消機制,獲取結果等功能。
Task
是基于ThreadPool
(或Thread
)的高級封裝,基本場景都適用
4.并行循環(Parallel)
Parallel類:提供簡單的并行迭代功能(如:for,foreach)自動利用線程池。
Parallel.For(0, 100, i => ProcessItem(i));
二.線程池(threadPool)和Thread/Task之間的聯系
1.ThreadPool和Thread的關系
1.ThreadPool是Thread的管理者
Thread
是最底層的線程對象,直接對應操作系統的線程資源。而ThreadPool
(線程池)是對Thread
的封裝和管理機制,它維護一個線程集合(“池”),當有任務需要執行時,會優先復用池中已存在的空閑線程,避免頻繁創建和銷毀Thread
對象(這是一項昂貴的操作)。2.threadPool對Thread的復用邏輯
當通過
ThreadPool.QueueUserWorkItem()
提交任務時,線程池會:
若池中有空閑線程,直接分配該線程執行任務;
若池中線程都在忙碌且未達最大線程數限制,會創建新的
Thread
加入池并執行任務;若達到最大限制,任務會進入隊列等待,直到有線程空閑。
2.ThreadPool和Task的關系
1.Task是ThreadPool的高級接口
Task
(任務并行庫 TPL 的核心)是比ThreadPool
更高層次的抽象,它默認基于ThreadPool
實現(特殊情況除外,如TaskCreationOptions.LongRunning
會直接創建新線程)。
簡單說:Task.Run(...)
或new Task(...).Start()
本質上是向線程池提交任務,由線程池中的Thread
執行。2.Task 對 ThreadPool 的擴展
ThreadPool
僅提供簡單的任務排隊功能,而Task
在此基礎上增加了豐富的特性:
任務返回值(
Task<TResult>
);任務延續(
ContinueWith
);取消機制(
CancellationToken
);異常處理(通過
try/catch
捕獲任務內異常);父子任務關聯等。
三.Thread和task的區別
1.抽象層次不同
Thread
:是對操作系統線程的直接封裝(1:1 映射),屬于底層 API,直接操作線程資源。
Task
:是基于線程池的高級抽象(.NET 4.0 引入的 TPL 任務并行庫核心),不直接對應單個線程,而是表示一個 “待執行的工作單元”。
2.資源消耗和效率
Thread
:
創建和銷毀成本高(涉及操作系統內核對象操作)。
每個
Thread
會占用獨立的棧空間(默認 1MB),大量創建可能導致內存壓力。不適合頻繁創建短期任務。
Task
:默認使用線程池中的線程(除非指定
TaskCreationOptions.LongRunning
),避免頻繁創建新線程。資源消耗低,適合批量處理短期任務(如并行計算、IO 操作回調)。
線程池會自動管理線程復用,效率更高
四.什么是操作系統資源/線程資源?
1.操作系統資源
指操作系統管理的所有硬件和軟件資源的總稱,是計算機系統運行的基礎。線程本身也是操作系統資源的一種,其他常見的操作系統資源還包括:
硬件資源:CPU、內存(物理內存、虛擬內存)、硬盤、網絡接口、顯卡等。
軟件資源:文件句柄(打開的文件)、網絡連接(Socket)、進程、線程、互斥鎖(Mutex)、信號量(Semaphore)等。
操作系統通過內核(Kernel)統一管理這些資源,進程 / 線程需要通過系統調用(System Call)向內核申請或釋放資源。
2.線程資源
是操作系統資源的一個子集,特指為線程運行所分配的系統資源,主要包括:
線程內核對象:操作系統內核中記錄線程狀態的數據結構(如線程 ID、優先級、狀態等)。
線程棧:獨立的內存區域(默認在 Windows 上為 1MB),用于存儲線程執行時的局部變量、函數調用棧等。
寄存器狀態:CPU 寄存器中保存的線程執行上下文(如指令指針、棧指針等),用于線程切換時恢復執行狀態。
簡單說:一個線程(無論通過 C# 的
Thread
類創建,還是操作系統原生線程)本質上是操作系統分配的一組 “線程資源” 的集合。
3.C#中Thread類和操作系統線程資源的關系
C# 中的
Thread
類是對操作系統線程資源的封裝:
當你創建
new Thread(...)
時,.NET 運行時會通過系統調用(如 Windows 的CreateThread
)向操作系統申請線程資源。操作系統內核會為其分配線程內核對象、棧空間等資源,并將線程加入調度隊列。
當調用
Start()
時,操作系統會調度該線程在 CPU 上執行。當線程執行完畢或被銷毀時,.NET 會釋放對應的操作系統線程資源(歸還給系統)。