background image

程序中可以通过建立多个线程来处理客户端的请求。线程甚至还可以简化虚拟机的实现 ,

Java

拟机(JVM)的垃圾回收器(garbage collector)通常运行在一个或多个线

程中。因此,使用线程将会从以下五个方面来改善我们的应用程序:
    1. 充分利用 CPU 资源
    现在世界上大多数计算机只有一块 CPU.因此,充分利用 CPU 资源显得尤为重要。当
执行单线程程序时,由于在程序发生阻塞时 CPU 可能会处于空闲状态。这将造成大量的
计算资源的浪费。而在程序中使用多线程可以在某一个线程处于休眠或阻塞时,而 CPU
又恰好处于空闲状态时来运行其他的线程。这样 CPU 就很难有空闲的时候。因此,CPU
资源就得到了充分地利用。
    2. 简化编程模型
    如果程序只完成一项任务,那只要写一个单线程的程序,并且按着执行这个任务的步
骤编写代码即可。但要完成多项任务,如果还使用单线程的话,那就得在在程序中判断
每项任务是否应该执行以及什么时候执行。如显示一个时钟的时、分、秒三个指针。使
用单线程就得在循环中逐一判断这三个指针的转动时间和角度。如果使用三个线程分另
来处理这三个指针的显示,那么对于每个线程来说就是指行一个单独的任务。这样有助
于开发人员对程序的理解和维护。
    3. 简化异步事件的处理
    当一

服务器

用程序在接收不同的客户端连接时最简单地处理方法就是为每一个客

户端连接建立一个线程。然后监听线程仍然负责监听来自客户端的请求。如果这种应用
程序采用单线程来处理,当监听线程接收到一个客户端请求后,开始读取客户端发来的
数据,在读完数据后,read 方法处于阻塞状态,也就是说,这个线程将无法再监听客户
端请求了。而要想在单线程中处理多个客户端请求,就必须使用非阻塞的 Socket 连接
和异步 I/O.但使用异步 I/O 方式比使用同步 I/O 更难以控制,也更容易出错。因此,使用
多线程和同步 I/O 可以更容易地处理类似于多请求的异步事件。
    4. 使 GUI 更有效率
    使用单线程来处理 GUI 事件时,必须使用循环来对随时可能发生的 GUI 事件进行扫描,
在循环内部除了扫描 GUI 事件外,还得来执行其他的程序代码。如果这些代码太长,那
么 GUI

事件就会被 冻结 ,直到这些代码被执行完为止。

    在现代的 GUI 框架(如 SWING、AWT 和 SWT)中都使用了一个单独的事件分派线
程(event dispatch thread,EDT)来对 GUI 事件进行扫描。当我们按下一个按钮时,
按钮的单击事件函数会在这个事件分派线程中被调用。由于 EDT 的任务只是对 GUI 事件
进行扫描,因此,这种方式对事件的反映是非常快的。
    5. 节约成本
    提高程序的执行效率一般有三种方法:
    (1)增加计算机的 CPU 个数。
    (2)为一个程序启动多个进程
    (3)在程序中使用多进程。
    第一种方法是最容易做到的,但同时也是最昂贵的。这种方法不需要修改程序,从理
论上说,任何程序都可以使用这种方法来提高执行效率。第二种方法虽然不用购买新的
硬件,但这种方式不容易共享数据,如果这个程序要完成的任务需要必须要共享数据的
话,这种方式就不太方便,而且启动多个线程会消耗大量的系统资源。第三种方法恰好
弥补了第一种方法的缺点,而又继承了它们的优点。也就是说,既不需要购买 CPU,也
不会因为启太多的线程而占用大量的系统资源(在默认情况下,一个线程所占的内存空
间要远比一个进程所占的内存空间小得多),并且多线程可以模拟多块 CPU 的运行方式,