首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

探索 XUL 内的多线程编程-1 前提条件

探索 XUL 内的多线程编程-1 前提条件

前提条件在本文中,您将开发一个 XUL(XML User Interface Language)应用程序。熟悉 XUL 开发会有帮助,但并非硬性要求。XUL 更像是一个 XML 小部件语言,在某些方面与 HTML 相似,也支持 JavaScript 和 CSS。您可以将其他语言与 XUL 结合使用,但在本文中我们只使用 JavaScript。因此,需要您具有 JavaScript 的经验,但对其他语言则不做要求。本文中使用的这些并发性 API 已经被引入了 Mozilla 的 JavaScript 1.9.1,它是 Firefox 3.5 的一部分。因而,您可以使用 Firefox 3.5 或 Mozilla 的 XULRunner 1.9.1 来运行本文中的代码。有关这些工具的相关链接,请参见 。
问题语句常用缩略语
  • API:应用程序编程接口(Application program interface)
  • CPU:中央处理器(Central Processing Unit)
  • CSS:级联样式表(Cascading Stylesheets)
  • HTML:超文本标记语言(Hypertext Markup Language)
  • IO:输入-输出(Input-Output)
  • JSON:JavaScript Object Notation
  • UI:用户界面(User Interface)
  • URL:统一资源定位符(Uniform Resource Locator)
  • XML:可扩展标记语言(Extensible Markup Language)
  • XPCOM:跨平台组件对象模型(Cross Platform Component Object Model)
  • XUL:XML 用户界面语言(XML User Interface Language)

早在 2005 年,Herb Sutter 就说过免费午餐的时代已经结束了。他的分析和结论都非常简单。摩尔定律已经完成了其使命。计算机的先进不再只体现在处理器的速度上。软件开发人员也已经很好地利用了不断增长的处理速度,他们总是在不断增加所需要的计算量!这是显而易见的。计算机的运行速度加快意味着您可以做更多的事情。现在,主要通过添加内核来使计算机速度变得更快。您虽然还是可以做更多的事情,但必须使用并发编程才行。您需要使用这些内核。
也许您对此早就有所耳闻。很多编程语言和平台都已增加了新的并发性功能以帮助开发人员充分利用多内核的计算机。对于某些已经具有多线程编程 API 的语言,这就意味着通过创建更好的 API 和抽象可以使多线程编程更易懂、更少出错。一些语言本身并不支持多线程编程,对多线程编程的支持是后来加上的。XUL 程序员最主要的编程语言 JavaScript 就是这样的例子。从 JavaScript 1.9.1 开始,多线程编程就被加入了 XUL 平台上的 JavaScript。
ye olde XUL 中的线程现在,您可能会对自已说:“等等! XUL 是 Firefox 及其扩展背后的主要技术。不要告诉我这些 XUL 应用程序一直以来都是单线程的!” 您说的当然对。但关键是要记住 XUL 支持的不只是 JavaScript。借助 XPCOM,还可以通过其他语言实现组件,特别是通过 C++。当然,C++ 能支持本机线程,所以总是可以通过该种方式在一个 XUL 应用程序中使用多线程。不过,XUL 的本机编程语言通常总是 JavaScript,或更确切地说是 Mozilla 式的 JavaScript。直到现在,JavaScript 仍然缺少一种能显式派生和管理任意线程的方法,但 JavaScript 1.9.1 却改变了这种现状。尽管只是一个较小的发布版,JavaScript 1.9.1  却增加了一项重要的新特性:通过 Workers API 实现多线程。
Workers API那么 JavaScript 中的这个 Workers API 究竟是什么呢?有了 Workers,就可以随意派生线程,并且可以使用这些线程实现任何想要完成的任务。在很多情况下,您都会希望在应用程序中派生一个或多个线程。一种常见用例是执行一些周期性操作。这在很多应用程序中十分常见,开发人员会使用 JavaScript 的 setInterval 函数来实现这个操作。此函数的惟一缺陷是:它在主线程上执行,因此,在此期间,它会阻塞与用户的任何交互。如果它的执行占用了显著的时间,那么在执行期间应用程序就会冻结。所以,最好在一个独立的线程上执行这个函数。
这也让我想起了多线程的一个更常用的用例:长时间运行的操作。任何在主线程上运行的这类操作都会导致应用程序冻结。我们总是希望这类操作在其自已的线程上执行。那么长时间运行的操作有哪些例子呢?您可能见到过大整数质因数分解,或是对复杂数据结构的庞大列表进行分类,这些都是长时间运行的操作。但它们并不是 XUL 应用程序中的常见任务。XUL 应用程序中较为常见的是一些 IO 类的操作,如访问 Web 服务或是从本地文件系统读取。这也是我们要在本文中研究的一种操作。您将看到 Workers API 不仅允许派生线程,而且还允许在所派生的线程上任意地执行复杂的任务。最后,作为这类操作的结果,可能需要对 UI 执行某些更新,但是用另外一个线程实现这个目的是很有风险的。幸好 Workers API 在设计时考虑到了这一点,极大地简化了原本可能很困难的场景。下面让我们看看如何利用 Workers API,并在一个简单的应用程序的上下文中对它进行研究。
返回列表