答案:同步线程
同步在多线程编程的非结构化性质与同步处理的结构化次序之间提供了一个折衷的办法。
使用同步技术,可以完成以下操作:
- 在必须以特定顺序执行任务时,显式控制代码运行的次序。
- 或者 - - 当两个线程同时共享相同的资源时,避免可能出现的问题。
例如,可以使用同步使显示过程处于等待状态,直至在另一线程中运行的数据检索过程结束。
同步的方法有两种:轮询和使用同步对象。轮询反复从循环中检查异步调用的状态。使用轮询管理线程的效率最低,因为反复检查各种线程属性的状态会浪费大量资源。
例如,如果轮询要查看线程是否已结束,可以使用
IsAlive 属性。使用此属性时要很小心,因为活动的线程不一定正在运行。可以使用线程的
ThreadState 属性来获得有关线程状态的详细信息。由于在任意给定时间,线程都可能处于多种状态,因此
ThreadState 中存储的值可以是
System.Threading.Threadstate 枚举中的值的组合。因此,在轮询时应当仔细检查所有相关的线程状态。例如,如果线程的状态表明它没有运行,则该线程可能已经完成。另一方面,它也可能被挂起或处于休眠状态。
可以想象,轮询为控制运行线程的次序,牺牲了多线程的部分优点。为此,可以使用效率较高的
Join 方法来控制线程。
Join 使调用过程处于等待状态,直至线程完成或调用超时(如果指定了超时)。“Join”这个名称来自这一想法,即创建的新线程是执行路径的一个分支。使用
Join 可以再次将单独的执行路径合并成一个线程。
图 1:线程有一点需要清楚:
Join 是同步调用或阻塞调用。调用 Join 或等待句柄的等待方法后,调用过程将停止并等待线程发出信号通知它已经完成。
Sub JoinThreads() Dim Thread1 As New System.Threading.Thread(AddressOf SomeTask) Thread1.Start() Thread1.Join() ' 等待线程运行结束。 MsgBox("线程运行结束")End Sub
这些控制线程的简单方法在管理少量线程时非常有用,但不适合大型项目。下一节将讨论可用于同步线程的一些高级技术。
高级同步技术
多线程应用程序通常使用等待句柄和监视器对象来同步多个线程。下表介绍了可用于同步线程的部分 .NET 框架类。