線程的一些主要狀態以及狀態之間的裝換 (如下圖)主要狀態為:1.新建 2.就緒3.運行 4阻塞 5.死亡 其中:join()可以用來邀請其他線程先執行 yield()告訴系統"把自己的CPU時間讓掉,讓其他線程或者自己運行"引入線程的好處:1 創建一個線程花費的時間少。2 兩個線...
線程的一些主要狀態以及狀態之間的裝換 (如下圖)
主要狀態為:1.新建 2.就緒 3.運行 4阻塞 5.死亡
其中:join()可以用來邀請其他線程先執行
yield()告訴系統"把自己的CPU時間讓掉,讓其他線程或者自己運行"
引入線程的好處:
1 創建一個線程花費的時間少。 2 兩個線程(在同一進程中的)的切換時間少。 3 由於同一個進程內的線程共用記憶體和文件,所以線程之間互相通信不必調用內核。 4 線程能獨立執行,能充分利用和發揮處理機與外圍設備並行工作的能力。線程池
當線程的執行時間遠大於創建時間和銷毀時間之和時,採用線程池不僅調整和縮短創建線程,銷毀線程的時間,而且它還顯著減少了創建線程的數目。
一般一個簡單線程池至少包含下列組成部分。
1. 線程池管理器(ThreadPoolManager):用於創建並管理線程池
2.工作線程(WorkThread): 線程池中線程
3. 任務介面(Task):每個任務必須實現的介面,以供工作線程調度任務的執行。
4.任務隊列:用於存放沒有處理的任務。提供一種緩衝機制。
下麵的簡單demo可以很好的解釋上麵線程以及線程池的實際用法
Demo運行圖:
本示例分別演示了單線程、多線程以及線程池簡單的應用。可以讓初學者對線程的印象更加深刻。
註:該示例使用VB.NET語言編寫,重在討論實現方法。對語言有要求者請繞道。謝謝
首先申明一個線程組、一個委托和兩個變數
Private ThreadAdd() As Thread '申明線程ThreadAdd() Private Delegate Sub ATList(ByVal Content As String) '申明一個委托 Private ListCount As Integer, CountLimit As Integer '申明一個List裡面總數,一個總填充數
單線程操作:
Dim MakeRand As New Random Dim i As Integer DataInit() Randomize() '初始化隨機數生成器 Do i = MakeRand.Next(1, 1000) ListCount = ListCount + 1 AddToListBox(Str(i)) Application.DoEvents() '處理當前在消息列隊中的所有Windows消息 Loop Until ListCount >= CountLimit '做迴圈,直到List裡面數大於等於需要填充的總數 MakeRand = Nothing
通過獲取到隨機數i,將得到的隨機數傳到AddToListBox方法並直接綁定至ListBox上。
ListBox1.Items.Add(Content) '將得到的隨機數添加到Listbox1上 If ListCount Mod 100 = 0 Or ListCount = CountLimit Then ProgressBar1.Value = ListCount '將當前List得到數賦值給進度條 Application.DoEvents() End If
多線程操作:
ReDim ThreadAdd(Val(TextBox1.Text) - 1) '申明最大允許的線程數 DataInit() '調用清空進度條和賦值填充數方法 For i = 0 To ThreadAdd.Length - 1 ThreadAdd(i) = New Thread(AddressOf ThreadAddToListBox) '分別將每一個線程用AddressOf創建任務,執行ThreadAddToListBox With ThreadAdd(i) '將當前線程傳入進來,分別開始線程 .IsBackground = True .Priority = ThreadPriority.Highest '設置線程的優先順序,當前優先順序最高 .Start() End With Next ThreadAdd = Nothing
此文的TextBox1就是運行圖中的線程數文本框,ReDim是動態對線程組賦值。通過ThreadAddToListBox 過程方法創建委托賦值
Private Sub ThreadAddToListBox() Dim ThreadAdd As New ATList(AddressOf AddToListBox) '實例化一個委托,並用AddressOf語句為這個委托賦值,通過調用AddToListBox過程方法 Dim MakeRand As New Random '申明一個隨機數 Dim i As Integer Randomize() '初始化隨機樹生成器 Do i = MakeRand.Next(1, 1000) Me.Invoke(ThreadAdd, Str(i)) '執行委托 ListCount = ListCount + 1 Loop Until ListCount >= CountLimit '當列表數超出總填充數則停止迴圈 ThreadAdd = Nothing MakeRand = Nothing End Sub
ListBox1.Items.Add(Content) '將得到的隨機數添加到Listbox1上 If ListCount Mod 100 = 0 Or ListCount = CountLimit Then ProgressBar1.Value = ListCount '將當前List得到數賦值給進度條 Application.DoEvents() End If
線程池操作:
DataInit() For i = 0 To Val(TextBox1.Text - 1) ThreadPool.UnsafeQueueUserWorkItem(AddressOf ThreadAddToListBox, Me) Next
線程池操作主要是通過調用UnsafeQueueUserWorkItem來為當前線程用委托賦值。
至此,線程操作的簡單demo已經全部結束,需要源碼demo的朋友可以小窗私聊我