VB.NET中多线程程序开发之线程控制
在了解了线程的各种状态之后,我们来看⼀下线程控制的⼀些⽅法,如下表:
是否需要实例化 ⽅法 说明
是 Start 使线程开始执⾏
是 Suspend 当线程到达⼀个安全点时暂停线程 是 Abort 当线程到达⼀个安全点时停⽌线程 是 Resume 恢复⼀个被挂起的线程 是 Join 等待⼀个线程结束
是 Interrupt 中断⼀个处于 WaitSleepJoin 状态的线程 否 Sleep 在指定的时间内暂停调⽤线程
否 SpinWait 通过空转来延迟线程的执⾏,在此过程中,线程仍然在执⾏,这好⽐创建了⼀个不断运⾏直到计数器⽤完为⽌的循环⼀样。
上表中,安全点是指代码中 CLR 可以安全执⾏⾃动垃圾回收的位置。 下⾯我们来对Sleep 和 Join 给予额外的说明: 1、 Thread.Sleep 当线程处于 Running 状态时,它可以调⽤ Sleep ⽅法。 Sleep ⽅法有两种不同的⽤法:'放弃线程的执⾏
'通过指定⼀个 Integer 类型的数值作为时间参数(毫秒) '或TimeSpan(类型的参数) 使当前线程 '进⼊ WaitJoinSleep 状态 Thread.Sleep(1000)
Thread.Sleep( New TimeSpan(0, 0, 0, 0, 100)) '放弃线程的执⾏
'不要使当前线程进⼊ WaitJoinSleep 状态 '把时间⽚让给其它线程
'通过指定参数 0 或 TimeSpan.Zero Thread.Sleep(0)
Thread.Sleep(TimeSpan.Zero) 2、 Thread.Join
Join ⽅法是我们可以使⽤的最简单的同步构造,在⼀个线程上调⽤ Join ⽅法时,调⽤线程会进⼊ WaitJoinSleep 状态,⽽且将⼀直保持到被调⽤的线程已经结束,这将允许线程阻塞执⾏,挂起到系统中其它线程的完成。请看如下⽰例: Sub Main()
Dim thd1 As New Thread( AddressOf Sub1) Dim thd2 As New Thread( AddressOf Sub2) thd1.Start() thd2.Start()
'等待上⾯两个线程结束 thd1.Join() thd2.Join()
'这时,可以保证两个线程都已经结束 End Sub
现在我们对线程的控制⽅法已经明⽩了,那么我们如何将这些知识应⽤到实践中呢?我们可能都遇到过这种情况: Private Done As Boolean = False
Public Sub Begin() While Not Done End While
Console.WriteLine( \"Done, OK!\" ) End Sub
这种做法,可能你我以前都⽤过,很明显,它会给系统带来⾮常沉重的负担。现在,我们可以利⽤ Thread.Sleep ⽅法来改善上述状况: Private Done As Boolean = False Public Sub Begin() While Not Done
Thread.Sleep(1000) End While
Console.WriteLine( \"Done, OK!\" ) End Sub
对⽐⼀下,仅仅加了⼀条语句,却使代码性能⼤⼤提升。当然,这个例⼦不过是冰⼭⼀⾓。 下⼀节,我们将会了解线程同步。