线程模型:谁该关心?

当一个访问者连上你的站点,他事实上真正地注册成为一个用户(通常命名为IUSR_MACHINE,在这里MACHINE是你的计算机的名称)。这提出了一个新挑战:如果在同一时间有许多访问者作相同一件事(作为同一用户),你的软件将不能设定事件发生的顺序)。例如,你不能编写一个用于更新从数据库中最近一次读取记录的组件,如果两个人同时访问这个数据库,那么你的组件将假定将要被更新的记录是上次所读的,错误就会发生!

作为一个组件开发者,你的责任是理解线程模型以及它怎样影响你的应用程序,你将会看到:Visual Basic的线程同Java的不一样。

Microsoft的组件对象模型引入了线程安全性这个概念。在以前,每个人都用同时只有一人使用的单用户Windows工作站,Windows NT和Internet改变了这一切。Web服务器可以同时处理多个请求,并且为了得到最优化的服务器效率,代码和数据连接是以池的形式出现。这意味着Web请求可能执行代码的一部分,然后Web请求可能请求相同的代码做别的事。代码不用考虑谁请求操作这种模型叫做自由线程。

不是所有的对象都是自由线程结构的。例如,Visual Basic和Microsoft Access就不是这样,VB5使用套间模型(见表28.1),而Access使用的是一种高效率的单线程结构。你必须根据其线程模型来确定如何使用一个组件,但是真正的“不安全”对象可以通过与Microsoft Transactions Server包相绑定来为其提更高级别的隔离,从而实现线程安全性。

表28.1 线程模型

模型

描述

单一线程

设计成单用户应用程序,所有的过程以线性方式处理,不要将其用于Web应用中。

套间线程

可以作为一个多用户使用组件,但在同一时间只能有单一线程,不要将其作为系统端对象使用(例如,用于应用程序级),因为那样会形成“瓶颈”。VB使用这种模型。

自由线程

作为一个多重使用组件,同一时间允许多个线程运行。J++和C++可以创建这种组件,但编程者需要对线程安全性有根本的了解。

所有

既可以以自由线程也可以以套间线程来操作,这是最理想的。缺省条件下,Java在Microsoft 环境下使用这种模型。

 

这章的剩余部分将通过三个“烹调书籍”的例子来介绍如何建立一个组件,在这些例子里假定你已经安装了Visual Basic5或Java编辑器,并且你知道如何在集成开发环境(IDE)中如何操作。

首先我们转向Java,它比VB复杂的多,同时它功能也更强大。它与C相似,处于Windows API函数更低一级位置。

接下来的两个例子使用VB,它是创建任何对象最简单的途径,但是我们第二个VB 例子将涉及到Windows API函数,以介绍一些高级概念。

技巧

Microsoft将Visual Basic,Visual C++,Visual J++ 等捆绑在一起,以Visual Studio97 的形式出现,这是在单一软件里获得多种开发环境的最值得的途径。

我们的前两个例子将用两种语言来建立相同功能的组件。组件本身并不如典型的产品组件复杂。主要有以下两个原因:

■产品组件需要额外的错误处理代码,而例子中不需要。

■一个真正的强壮的例子阅读起来很困难,因为代码复杂性将阻碍我们的学习。

此组件将一个州的缩写作为输入,返回所有州中的滑翔机俱乐部,以表格形式输出。这难道就不能用VBScript而不通过编写一个组件来实现吗?当然是可以的,但编写组件的优点就在于我们的代码是编译过的,从而达到保持你知识产权的目的。

因为这个组件作为一个会话级对象(每个用户一个局柄),套间线程是比较适用的,Visual Basic和Java都可以创建套间模型对象,所以两种工具都适用。