網站首頁 編程語言 正文
一、ThreadPool概述
提供一個線程池,該線程池可用于執行任務、發送工作項、處理異步 I/O、代表其他線程等待以及處理計時器。
創建線程需要時間。如果有不同的小任務要完成,就可以事先創建許多線程/在應完成這些任務時發出請求。不需要自己創建這樣一個列表。該列表由ThreadPool類托管。
這個類會在需要時增減池中線程的線程數,直到最大的線程數。池中的最大線程數是可配置的。在雙核CPU中,默認設置為1023 個工作線程和1000個I/O線程。也可以指定在創建線程池時應立即啟動的最小線程數,以及線程池 中可用的最大線程數。
如果有更多的作業要處理,線程池中線程的個數也達到了極限,最新的作業就要排隊,且必須等待線程完成其任務。
線程池使用起來很簡單,但它有一些限制:
- 線程池中的所有線程都是后臺線程。如果進程的所有前臺線程都結束了,所有的后臺線程 就會停止。不能把入池的線程改為前臺線程。
- 不能給入池的線程設置優先級或名稱。
- 對于COM對象,入池的所有線程都是多線程單元(multithreaded apartment, MTA)線程。許 多COM對象都需要單線程單元(single-threaded apartment, MTA)線程。
- 入池的線程只能用于時間較短的任務。如果線程要一直運行(如Word的拼寫檢杳器線程), 就應使用Thread類創建一個線程.
使用線程池線程的操作的情況包括:
- 當您創建Task或Task<TResult>對象以異步方式執行某項任務,默認情況下任務調度在線程池線程上運行的。
- 異步計時器使用線程池。 線程池線程從System.Threading.Timer類執行回調,和從System.Timers.Timer類引發事件。
- 當使用已注冊的等待句柄時,系統線程監視等待句柄的狀態。 等待操作完成后,從線程池的工作線程將執行相應的回調函數。
- 當您調用QueueUserWorkItem方法進行排隊,以在線程池線程上執行的方法。 為此,可將該方法傳遞WaitCallback委托。
二、方法
-
GetAvailableThreads(Int32, Int32)
檢索由 GetMaxThreads(Int32, Int32) 方法返回的最大線程池線程數和當前活動線程數之間的差值。 -
GetMaxThreads(Int32, Int32)
檢索可以同時處于活動狀態的線程池請求的數目。 所有大于此數目的請求將保持排隊狀態,直到線程池線程變為可用。 -
SetMaxThreads(Int32, Int32)
設置可以同時處于活動狀態的線程池的請求數目。 所有大于此數目的請求將保持排隊狀態,直到線程池線程變為可用。 -
GetMinThreads(Int32, Int32)
發出新的請求時,在切換到管理線程創建和銷毀的算法之前檢索線程池按需創建的線程的最小數量。 -
SetMinThreads(Int32, Int32)
發出新的請求時,在切換到管理線程創建和銷毀的算法之前設置線程池按需創建的線程的最小數量。 -
QueueUserWorkItem(WaitCallback, Object)
將方法排入隊列以便執行,并指定包含該方法所用數據的對象。 此方法在有線程池線程變得可用時執行。 -
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)
注冊一個等待 WaitHandle 的委托,并指定一個 32 位有符號整數來表示超時值(以毫秒為單位)。
三、獲取線程數方法
int i = 0; int j = 0; //前面是輔助(也就是所謂的工作者)線程,后面是I/O線程 ThreadPool.GetMaxThreads(out i, out j); Console.WriteLine(i.ToString() + " " + j.ToString()); //默認都是1000 //獲取空閑線程,由于現在沒有使用異步線程,所以為空 ThreadPool.GetAvailableThreads(out i, out j); Console.WriteLine(i.ToString() + " " + j.ToString()); //默認都是1000
四、QueueUserWorkItem(WaitCallback, Object)
將方法排入隊列以便執行,并指定包含該方法所用數據的對象。 此方法在有線程池線程變得可用時執行。
public static bool QueueUserWorkItem (System.Threading.WaitCallback callBack, object state);
實例:
static void Main(string[] args) { Person p = new Person(1, "劉備"); //啟動工作者線程 ThreadPool.QueueUserWorkItem(new WaitCallback(RunWorkerThread), p); } static void RunWorkerThread(object obj) { Thread.Sleep(200); Console.WriteLine("線程池線程開始!"); Person p = obj as Person; Console.WriteLine(p.Name); } public class Person { public Person(int id, string name) { Id = id; Name = name; } public int Id { get; set; } public string Name { get; set; } }
五、RegisterWaitForSingleObject 注冊等待句柄
注冊一個等待 WaitHandle 的委托,并指定一個數來表示超時值(以毫秒為單位)。
將指定的方法排隊到線程池,當超時或者等待委托接收到信號時,輔助線程將執行此方法,即主線程控制輔助線程什么時候開始執行。
public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject (System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object state, int millisecondsTimeOutInterval, bool executeOnlyOnce);
參數
-
waitObject
要注冊的 WaitHandle。 使用 WaitHandle 而非 Mutex。 -
callBack
向 waitObject 參數發出信號時調用的 WaitOrTimerCallback 委托。 -
state
傳遞給委托的對象。 -
millisecondsTimeOutInterval
以毫秒為單位的超時。 如果 millisecondsTimeOutInterval 參數為 0(零),函數將測試對象的狀態并立即返回。 如果 millisecondsTimeOutInterval 為 -1,則函數的超時間隔永遠不過期。
表示間隔幾秒執行回調方法,指當剛加入線程后,它是需要過了幾秒后才會第一次執行回調方法。如果使用了wait.Set()方法使用立即執行回調函數而不需要等待。 -
executeOnlyOnce
如果為 true,表示在調用了委托后,線程將不再在 waitObject 參數上等待;如果為 false,表示每次完成等待操作后都重置計時器,直到注銷等待。
返回
-
RegisteredWaitHandle
封裝本機句柄的 RegisteredWaitHandle。
// TaskInfo contains data that will be passed to the callback method. public class TaskInfo { public RegisteredWaitHandle Handle = null; public string OtherInfo = "default"; } public static void Main(string[] args) { // 主線程使用AutoResetEvent來給已注冊的等待句柄發信號, 此等待句柄執行回調方法 AutoResetEvent ev = new AutoResetEvent(false); TaskInfo ti = new TaskInfo(); ti.OtherInfo = "First task"; // The TaskInfo for the task includes the registered wait handle returned by RegisterWaitForSingleObject. This // allows the wait to be terminated when the object has been signaled once (see WaitProc). ti.Handle = ThreadPool.RegisterWaitForSingleObject( ev, new WaitOrTimerCallback(WaitProc), ti, 1000, false ); // 主線程等待三秒,為了演示隊列中的線程超時,然后發信號. Thread.Sleep(3100); Console.WriteLine("Main thread signals."); ev.Set();//發信號 // The main thread sleeps, which should give the callback method time to execute. If you comment out this line, the program usually ends before the ThreadPool thread can execute. Thread.Sleep(1000); // If you start a thread yourself, you can wait for it to end by calling Thread.Join. This option is not available with thread pool threads. } //The callback method executes when the registered wait times out, //or when the WaitHandle (in this case AutoResetEvent) is signaled. //WaitProc unregisters the WaitHandle the first time the event is signaled. public static void WaitProc(object state, bool timedOut) { TaskInfo ti = (TaskInfo)state; string cause = "TIMED OUT"; if (!timedOut) //如果Timeout為false,表示接收到的信號后執行的 { cause = "SIGNALED"; //如果回調方法執行的話是因為WaitHandle觸發信號的話,則用反注冊等待句柄來取消回調方法將來的執行。 if (ti.Handle != null) ti.Handle.Unregister(null);// } Console.WriteLine("WaitProc( {0} ) executes on thread {1}; cause = {2}.", ti.OtherInfo, Thread.CurrentThread.GetHashCode().ToString(), cause);//超時后執行的 }
結果如下:
WaitProc( First task ) executes on thread 7; cause = TIMED OUT.
WaitProc( First task ) executes on thread 7; cause = TIMED OUT.
WaitProc( First task ) executes on thread 7; cause = TIMED OUT.
Main thread signals.
WaitProc( First task ) executes on thread 7; cause = SIGNALED.
原文鏈接:https://www.cnblogs.com/springsnow/p/9428805.html
相關推薦
- 2022-05-17 C++?std::shared_mutex讀寫鎖的使用_C 語言
- 2022-04-25 ASP.NET?Core?MVC中Tag?Helpers用法介紹_實用技巧
- 2022-12-27 Go標準庫日志打印及同時輸出到控制臺與文件_Golang
- 2022-03-19 C語言數據的存儲詳解_C 語言
- 2022-05-21 C++?Cmake的構建靜態庫和動態庫詳解_C 語言
- 2022-05-16 通過T-SQL語句創建游標與實現數據庫加解密功能_MsSql
- 2022-07-04 聯邦學習FedAvg中模型聚合過程的理解分析_其它綜合
- 2023-02-02 C語言求素數的幾種方式總結_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支