在了解了線程的各種狀態(tài)之后,我們來看一下線程控制的一些方法,如下表:
是否需要實例化 方法 說明
是 Start 使線程開始執(zhí)行
是 Suspend 當線程到達一個安全點時暫停線程
是 Abort 當線程到達一個安全點時停止線程
是 Resume 恢復一個被掛起的線程
是 Join 等待一個線程結(jié)束
?/td> Interrupt 中斷一個處于 WaitSleepJoin 狀態(tài)的線程
否 Sleep 在指定的時間內(nèi)暫停調(diào)用線程
否 SpinWait 通過空轉(zhuǎn)來延遲線程的執(zhí)行,在此過程中,線程仍然在執(zhí)行,這好比創(chuàng)建了一個不斷運行直到計數(shù)器用完為止的循環(huán)一樣。
上表中,安全點是指代碼中 CLR 可以安全執(zhí)行自動垃圾回收的位置。
下面我們來對Sleep 和 Join 給予額外的說明:
1、 Thread.Sleep 當線程處于 Running 狀態(tài)時,加入收藏 它可以調(diào)用 Sleep 方法。
Sleep 方法有兩種不同的用法:
'放棄線程的執(zhí)行
'通過指定一個 Integer 類型的數(shù)值作為時間參數(shù)(毫秒)
'或TimeSpan(類型的參數(shù)) 使當前線程
'進入 WaitJoinSleep 狀態(tài)
Thread.Sleep(1000)
Thread.Sleep( New TimeSpan(0, 0, 0, 0, 100))
'放棄線程的執(zhí)行
'不要使當前線程進入 WaitJoinSleep 狀態(tài)
'把時間片讓給其它線程
'通過指定參數(shù) 0 或 TimeSpan.Zero
Thread.Sleep(0)
Thread.Sleep(TimeSpan.Zero)
2、 Thread.Join
Join 方法是我們可以使用的最簡單的同步構(gòu)造,在一個線程上調(diào)用 Join 方法時,調(diào)用線程會進入 WaitJoinSleep 狀態(tài),而且將一直保持到被調(diào)用的線程已經(jīng)結(jié)束,這將允許線程阻塞執(zhí)行,掛起到系統(tǒng)中其它線程的完成。請看如下示例:
Sub Main()
Dim thd1 As New Thread( AddressOf Sub1)
Dim thd2 As New Thread( AddressOf Sub2)
thd1.Start()
thd2.Start()
'等待上面兩個線程結(jié)束
thd1.Join()
thd2.Join()
'這時,可以保證兩個線程都已經(jīng)結(jié)束
End Sub
現(xiàn)在我們對線程的控制方法已經(jīng)明白了,那么我們?nèi)绾螌⑦@些知識應(yīng)用到實踐中呢?我們可能都遇到過這種情況:
Private Done As Boolean = False
Public Sub Begin()
While Not Done
End While
Console.WriteLine( "Done, OK!" )
End Sub
這種做法,可能你我以前都用過,很明顯,它會給系統(tǒng)帶來非常沉重的負擔?,F(xiàn)在,我們可以利用 Thread.Sleep 方法來改善上述狀況:
Private Done As Boolean = False
Public Sub Begin()
While Not Done
Thread.Sleep(1000)
End While
Console.WriteLine( "Done, OK!" )
End Sub
對比一下,僅僅加了一條語句,卻使代碼性能大大提升。當然,這個例子不過是冰山一角。 下一節(jié),我們將會了解線程同步。
是否需要實例化 方法 說明
是 Start 使線程開始執(zhí)行
是 Suspend 當線程到達一個安全點時暫停線程
是 Abort 當線程到達一個安全點時停止線程
是 Resume 恢復一個被掛起的線程
是 Join 等待一個線程結(jié)束
?/td> Interrupt 中斷一個處于 WaitSleepJoin 狀態(tài)的線程
否 Sleep 在指定的時間內(nèi)暫停調(diào)用線程
否 SpinWait 通過空轉(zhuǎn)來延遲線程的執(zhí)行,在此過程中,線程仍然在執(zhí)行,這好比創(chuàng)建了一個不斷運行直到計數(shù)器用完為止的循環(huán)一樣。
上表中,安全點是指代碼中 CLR 可以安全執(zhí)行自動垃圾回收的位置。
下面我們來對Sleep 和 Join 給予額外的說明:
1、 Thread.Sleep 當線程處于 Running 狀態(tài)時,加入收藏 它可以調(diào)用 Sleep 方法。
Sleep 方法有兩種不同的用法:
'放棄線程的執(zhí)行
'通過指定一個 Integer 類型的數(shù)值作為時間參數(shù)(毫秒)
'或TimeSpan(類型的參數(shù)) 使當前線程
'進入 WaitJoinSleep 狀態(tài)
Thread.Sleep(1000)
Thread.Sleep( New TimeSpan(0, 0, 0, 0, 100))
'放棄線程的執(zhí)行
'不要使當前線程進入 WaitJoinSleep 狀態(tài)
'把時間片讓給其它線程
'通過指定參數(shù) 0 或 TimeSpan.Zero
Thread.Sleep(0)
Thread.Sleep(TimeSpan.Zero)
2、 Thread.Join
Join 方法是我們可以使用的最簡單的同步構(gòu)造,在一個線程上調(diào)用 Join 方法時,調(diào)用線程會進入 WaitJoinSleep 狀態(tài),而且將一直保持到被調(diào)用的線程已經(jīng)結(jié)束,這將允許線程阻塞執(zhí)行,掛起到系統(tǒng)中其它線程的完成。請看如下示例:
Sub Main()
Dim thd1 As New Thread( AddressOf Sub1)
Dim thd2 As New Thread( AddressOf Sub2)
thd1.Start()
thd2.Start()
'等待上面兩個線程結(jié)束
thd1.Join()
thd2.Join()
'這時,可以保證兩個線程都已經(jīng)結(jié)束
End Sub
現(xiàn)在我們對線程的控制方法已經(jīng)明白了,那么我們?nèi)绾螌⑦@些知識應(yīng)用到實踐中呢?我們可能都遇到過這種情況:
Private Done As Boolean = False
Public Sub Begin()
While Not Done
End While
Console.WriteLine( "Done, OK!" )
End Sub
這種做法,可能你我以前都用過,很明顯,它會給系統(tǒng)帶來非常沉重的負擔?,F(xiàn)在,我們可以利用 Thread.Sleep 方法來改善上述狀況:
Private Done As Boolean = False
Public Sub Begin()
While Not Done
Thread.Sleep(1000)
End While
Console.WriteLine( "Done, OK!" )
End Sub
對比一下,僅僅加了一條語句,卻使代碼性能大大提升。當然,這個例子不過是冰山一角。 下一節(jié),我們將會了解線程同步。

