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

字號(hào):

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