VB.NET中多線程程序開發(fā)之線程控制

字號:

在了解了線程的各種狀態(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é),我們將會了解線程同步。