文档介绍:作者:jeru
日期:2001-3-7 11:20:12
Java 线程的讨论与应用
龙士工
一、为什么要研究和使用线程
一般来说, 计算机正在执行的程序称作进程(process), 进程有不同的地址空间并且是在同一系统上运行的不同程序, 如 W O R D 和Excel, 进程间的通讯是很费时而且有限的。上下文切换、改变运行的进程也是非常复杂的。进程间通讯复杂, 可能需要管道、消息队列、共享内存(sharedmemory) 或信号处理来保证进程间的通讯。尽管许多程序都在运行, 但一次只能与一个程序打交道。
线程(thread) 是指进程中单一顺序的控制流。又称为轻量级进程。线程则共享相同的地址空间并共同构成一个大的进程。线程间的通讯是非常简单而有效的, 上下文切换非常快并且是整个大程序的一部分切换。线程仅是过程调用, 它们彼此独立执行, 线程使得在一个应用程序中, 程序的编写更加自由和丰富。线程的兴趣在于, 一个程序中同时使用多个线程来完成不同的任务。因此如果很好地利用线程, 可以大大简化应用程序设计。多线程可以增进程序的交互性, 提供更好的能力和功能、更好的GUI 和更好的服务器功能。给二个例子说明如下:
例一: 利用多线程并行机制可以很好地解决交互式网络程序中的许多问题, 如: 大量的网络文件资源的读写、用户输入响应、动画显示等问题不需要 C P U 的多少时间; 而耗时的复杂计算通常并不需要立即响应, 所以无需将 C P U 全给它。例如, 从一个慢速的网络上读取一数据流也许要 1 分钟时间, 但需要 C P U 参与传输数据的时间则非常短; 响应用户的输入如击键, 就算最快的输入员, 1 秒钟击键 1 0 次, 也不需要 C P U 的多少时间。动画程序比较耗时, 一幅画在 1 秒内要重绘 5 - 1 0 次, 但 C P U 在大部分时间仍处于空闲状态。在传统的单线程环境下的问题是用户必须等待每个任务完成后才能进行下一个任务。即使 C P U 大部分时间空闲,
也只能按步就班地工作。多线程可以很好地解决这些问题避免引起用户的等待。如: 耗时的复杂计算应用就可划分成两个控制线程: 一个处理GUI 的用户事件, 另一个进行后台计算。
例二: 如并发服务器, 它面向不定长时间内处理完的请求, 对每个请求由服务器的线程处理。传统的并发服务器往往是基于多进程机制的, 每个客户一个进程, 需要操作系统的干预, 进程的数目受操作系统的限制。本文利用Java 的线程机制建立了基于多线程的并发服务器。生成和管理他们是相当简单的操作。线程被用来建立请求驱动的服务程序, 每个客户一个线程, 多个线程可以并发执行。特别地线程具有如下特性(1) 线程共享父进程的所有程序和数据(2) 有自身的运行单元(3) 有它自己的私有存储和执行环境( 尤其是处理器寄存器), 使得服务器进程不随客户数的增加而线性增加。可减少服务器进程的压力, 降低开销, 充分利用CPU 的资源。以上并发服务器在某一瞬间由同一服务器进程所产生的多个并发线程对多个客户的并发请求采取分而治之的措施, 从而解决了并发请求的问题。各线程即可以独立操作, 又可以协同作业。降低了服务器的复杂度。
Java 是基于操作系统级的多线程环境之上设计的,Java 的运行器依靠多线程来执行任务,