摘要:
系列文章,從一個基本的代碼說起,逐步探索 ThreadPool 的奧妙。
首先,看看線程池的樣子:
從看出,線程池維護1個至n個線程,作業系統從請求隊列中提取請求分配個線程池中的適合線程處理。
先寫下如下的代碼:
using System;
using System.Threading;
public class ThreadBase
{
public static void Main ( ) {
System.Threading.WaitCallback waitCallback = new WaitCallback ( MyThreadWork );
ThreadPool.QueueUserWorkItem ( waitCallback, "第一個線程" );
ThreadPool.QueueUserWorkItem ( waitCallback, "第二個線程" );
ThreadPool.QueueUserWorkItem ( waitCallback, "第三個線程" );
ThreadPool.QueueUserWorkItem ( waitCallback, "第四個線程" );
Console.ReadLine ( );
}
public static void MyThreadWork ( object state ) {
Console.WriteLine ( "線程現在開始啟動…… {0}",(string)state );
Thread.Sleep ( 10000 );
Console.WriteLine ( "運行結束…… {0}",( string ) state );
}
}
分析上面的代碼:
一、首先定義了一個 System.Threading.WaitCallback 對象 waitCallback。
WaitCallback 是一個委託,表示線程池線程要執行的回調方法,它的原型如下:[ComVisibleAttribute(true)]
public delegate void WaitCallback (
Object state
)
1、這裡有一個 Callback 機制的問題,所謂的Callback 簡單的理解就是由作業系統調用的函數,我們自己寫的程式不需要調用。就像有個修理工到家裡搞修理,你只需要告訴他鉗子、螺絲刀、膠布等修理工具在什麼地方就行,而不要管他在什麼時候、在什麼地方怎樣使用這些修理工具。
2、WaitCallback 的參數" Object state",這個參數包含回調方法要使用的資訊的對象。在接下來的情況中我再說。
既然 WaitCallback 委託的原型如此,那麼我們就申明一個跟它的樣子差不多的函數,這個函數就是要線程做的事情。public static void MyThreadWork ( object state )
這裡函數中多了一個 "static",這是因為Main的關係(更大一點就是因為C#語言機制的問題),如果WaitCallback 的對象不是在靜態(static)方法中,這個static 是不需要的。
二、接著就是要執行的方法放入線程池中,以便作業系統執行。
我這裡放置了四個方法要作業系統執行:
ThreadPool.QueueUserWorkItem ( waitCallback, "第一個線程" );
ThreadPool.QueueUserWorkItem ( waitCallback, "第二個線程" );
ThreadPool.QueueUserWorkItem ( waitCallback, "第三個線程" );
ThreadPool.QueueUserWorkItem ( waitCallback, "第四個線程" );
這裡,我放置到線程池中的操作是一樣的,當然也可以不一樣,接下來說。
三、最後阻塞主線程,等待線程池中的線程執行 Console.ReadLine ( );
如果忽略掉這個代碼,則有可能看不到任何輸出
好了,這是主線程做的事情了,接下來看看線程池中的線程做的事情。
這個很簡單,就是將線程的參數輸出,然後線程睡眠(sleep)一段時間,最後輸出線程結束的資訊。