使用并发最强制性的原因之一就是要产生能够作出响应的用户界面。考虑一个程序,它要
执行某项CPU深度占用的计算,这样就会导致用户的输入被忽略,也就无法作出响应。问题
的实质是:程序需要一边连续进行计算,同时还要把控制权交给用户界面,这样程序才能
响应用户的操作。如果你有一个“退出”按钮,你一定不希望在程序的每段代码里都检测按
钮状态,但你还是希望对这个按钮能够作出响应,就好像你定期对其进行检测一样。
传统的方法不可能一边连续执行其操作,同时又把控制权交给程序的其余部分。事实上,
这听起来就像是不可能完成的任务,就好象让一个处理器同时出现在两个地方,但这恰恰
是并发编程所能够提供的错觉效果。
并发还可以用来优化程序的吞吐量。比如,在你等待数据到达输入/输出端口的时候,你可
以进行其他重要的工作。要是不用线程的话,唯一可行的办法就是不断查询输入/输出端口,
这种方法不仅笨拙,而且很困难。
如果你有一台有多处理器的机器,多个线程就可以分布在多个处理器上,这可以极大地提
高吞吐量。这种情况通常出现在有多个强劲处理器的web服务器上,在这种环境下,程序对
于每个用户请求都将分配一个线程,这样就可以把大量的请求分配给多个处理器来处理。
需要牢记的是,具有多个线程的程序,必须也能够在只有单处理器的机器上运行。因此,
不使用任何线程而写出具有同样功能的程序也是可能的。然而,使用多线程的重要好处是
可以使程序的组织更有条理,因而能大大简化程序设计。对于某些类型的问题,比如模拟
视频游戏,如果没有对并发的支持将会非常难以解决。
线程模型为编程带来了便利,它简化了在单一程序中交织在一起同时运行的多个操作。在
使用线程时,处理器将轮流给每个线程分配其占用时间。每个线程都觉得自己在一直占用
处理器,但事实上处理器时间是划分成片段分配给了所有的线程。例外情况是程序运行在
具有多个处理器的机器上,但线程的一大好处是可以使你从这个层次抽身出来,即代码不
必知道它是运行在具有一个还是多个处理器的机器上。所以,线程是一种建立透明的、可
扩展的程序的方法,如果程序运行得太慢,为机器增添一个处理器就能很容易地加快程序
的运行速度。多任务和多线程往往是使用多处理机系统的最合理方式。
在单处理器机器上,线程会降低一些运行效率,但是,从程序设计、资源平衡、用户使用
方便等方面来看,还是非常值得的。一般来说,线程使你能得到更加松散耦合的设计;否
则的话,你将不得不在部分代码中直接关注那些通常由线程处理的工作。