ActiveX 客户机编程(线程技术技巧)
ActiveX 到 Enterprise JavaBeans (EJB) 网桥支持自由线程和公寓线程访问,并实现自由线程 Marshaler 以在混合环境 (例如 Active Server Pages (ASP)) 中工作。 当在 ActiveX 进程中创建的每个线程通过 ActiveX 与 EJB 网桥通信时,将在 Java™ 环境中对其进行镜像。
在 ActiveX 线程中装入对 Java 对象 (没有 JObjectProxy 或 JClassProxy 对象) 的所有引用时, ActiveX 到 EJB 网桥会将该线程与 Java 虚拟机 (JVM) 代码拆离。 因此,您必须注意从多线程 Windows 应用程序访问的任何 Java 代码都是线程安全的。 Visual Basic 代码和 VBScript 应用程序本质上都是单线程的。 因此, Visual Basic 和 VBScript 应用程序在其访问的 Java 程序中不存在线程技术问题。 Active Server Page 与多线程 C 和 C++ 程序可能会有问题。
- 多线程 Windows Automation Container (我们的 ActiveX 进程) 将启动。 它位于线程 A。
- ActiveX 进程初始化 ActiveX 到 EJB 网桥,它启动 JVM 代码。 JVM 连接到同一线程并内部地将其称为 Thread 1。
- ActiveX 进程启动两个线程:B 和 C。
- ActiveX 进程中的线程 B 使用 ActiveX 到 EJB 网桥访问线程 A 中创建的对象。JVM 连接到线程 B 并将其称为 Thread 2。
- ActiveX 进程中的线程 C 从不与 JVM 代码交流,因此 JVM 从不需要连接到。 这是 JVM 代码在 ActiveX 线程与 Java 线程之间没有一对一关系的情况。
- 线程 B 稍后释放其使用的所有 JObjectProxy 和 JClassProxy 对象。 已拆离 Java 线程 2。
- 线程 B 再次使用 ActiveX 到 EJB 网桥访问线程 A 中创建的对象。JVM 代码再次连接到线程并将其称为 Thread 3。
| ActiveX 进程 | 由 ActiveX 进程访问的 JVM |
|---|---|
| 线程 A - 在 1 中创建 | Thread 1 - 在 2 中连接 |
| 线程 B - 在 4 中创建 | Thread 2 - 在 4 中连接,在 6 Thread 3 中分离 - 在 7 中连接 |
| 线程 C - 在 4 中创建 |
线程和 Active Server Page
Microsoft Internet Information Server 中的活动服务器页面 (ASP) 是多线程环境。 当您创建 XJB.JClassFactory 对象时,您可以将其存储到应用程序集合中作为应用程序全局对象。 现在,ASP 环境中的所有线程都访问相同的 ActiveX 到 EJB 网桥对象。 Active Server Page 在缺省情况下对每个 CPU 每个 ASP 进程创建 10 个单元线程。 这意味着当初始化您的 ActiveX 到 EJB 网桥对象时,它可以通过 10 个线程的任何一个调用该对象,而不是仅通过创建该对象的那一个线程。
如果您需要模拟 single-apartment 的行为,可以用 Visual Basic 代码创建 single-apartment 线程的 ActiveX 动态链接库 (DLL) 并封装 ActiveX 到 EJB 网桥对象。 此封装保证所有到 JVM 对象的访问都使用了相同的线程。 您需要使用 <OBJECT> 标记将 XJB.JClassFactory 分配给应用程序对象,并且必须意识到在网络应用程序中引入单线程行为的后果。
- Q243543 INFO:不要将 STA 对象存储到会话或应用程序中
- Q243544 INFO:在 Active Server Page 下的组件线程模型摘要
- Q243548 INFO:为 ASP 下的 VB 组件设计准则