
图2 线程状态转换
3.5 线程池
在应用程序中使用多线程操作能优化应用程序性能,但是多线程往往需要花费更多的代码和精力去控制线程以及实现线程之间的轮询和状态转换。使用线程池则可以自动完成这些工作,同时还可以优化计算机的访问性能,从而更加有效的利用多线程的优势。使用线程池,可以使用要运行的过程的委托来调用 ThreadPool.QueueUserWorkItem 方法,VB .NET 将创建线程并运行该过程。以下代码说明了如何使用线程池启动多个任务。
Sub DoMyWork()
Dim MyPool As System.Threading.ThreadPool ' 将一个任务排队
MyPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf Task1))
MyPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf Task2))
End Sub
如果要启动很多单独的任务,但并不需要单独设置每个线程的属性,则线程池将非常有用。每个线程都以默认的堆栈大小和优先级启动。默认情况下,每个系统处理器上最多可以运行25个线程池线程。超过该限制的其它线程会被排队,直至其它线程运行结束后它们才能开始运行。
线程池并不是在所有的情况下都适用,当需要特定优先级的线程时就没法通过线程池来实现。
3.6 线程的同步
在多线程应用中,我们需要考虑不同线程之间的数据同步和防止死锁。当两个或多个线程之间同时等待对方释放资源的时候就会形成线程之间的死锁。为了防止死锁的发生,我们需要通过同步来实现线程安全。在Visual Basic.NET中提供了三种方法来完成线程的同步。
(1) 代码域同步:使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段。
(2) 手工同步:可以使用不同的同步类(诸如WaitHandle, Mutex, ReaderWriterLock, ManualResetEvent, AutoResetEvent 和Interlocked等)创建自己的同步机制。这种同步方式要求你自己手动的为不同的域和方法同步,这种同步方式也可以用于进程间的同步和解除由于对共享资源的等待而造成的死锁。
(3) 上下文同步:使用SynchronizationAttribute为ContextBoundObject对象创建简单的,自动的同步。这种同步方式仅用于实例化的方法和域的同步。所有在同一个上下文域的对象共享同一个锁。
4. 结束语
本文讨论了Visual Basic.NET中多线程开发技术。多线程技术是实现需要并发执行的应用程序的较好选择,尤其对于大部分时间被阻塞的程序段,例如在开发访问网络资源,系统开销比较大的操作或实现快速的用户界面响应时,具有不可替代的作用。但由于每个线程都需要额外的内存来创建,同时还需要处理器时间片来运行和管理线程,因此如果创建的线程过多,反而会降低应用程序的性能。所以在设计多线程应用程序时,应慎重对待,建立合理的系统模型,这样才能使应用程序获得最佳的性能。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



