总结
何时使用多线程技术以及何时避免用它这是我们需要掌握的重要课题它的主要目的是对大量任务进行有序的管理通过多个任务的混合使用可以更有效地利用计算机资源或者对用户来说显得更方便资源均衡的经典问题是在IO等候期间如何利用CPU至于用户方面的方便性最经典的问题就是如何在一个长时间的下载过程中监视并灵敏地反应一个停止(stop)按钮的按下
多线程的主要缺点包括
() 等候使用共享资源时造成程序的运行速度变慢
() 对线程进行管理要求的额外CPU开销
() 复杂程度无意义的加大比如用独立的线程来更新数组内每个元素的愚蠢主意
() 漫长的等待浪费精力的资源竞争以及死锁等多线程症状
线程另一个优点是它们用轻度执行切换(条指令的顺序)取代了重度进程场景切换(条指令)由于一个进程内的所有线程共享相同的内存空间所以轻度场景切换只改变程序的执行和本地变量而在重度场景切换时一个进程的改变要求必须完整地交换内存空间
线程处理看来好象进入了一个全新的领域似乎要求我们学习一种全新的程序设计语言——或者至少学习一系列新的语言概念由于大多数微机操作系统都提供了对线程的支持所以程序设计语言或者库里也出现了对线程的扩展不管在什么情况下涉及线程的程序设计
() 刚开始会让人摸不着头脑要求改换我们传统的编程思路
() 其他语言对线程的支持看来是类似的所以一旦掌握了线程的概念在其他环境也不会有太大的困难尽管对线程的支持使Java语言的复杂程度多少有些增加但请不要责怪Java毕竟利用线程可以做许多有益的事情
多个线程可能共享同一个资源(比如一个对象里的内存)这是运用线程时面临的最大的一个麻烦必须保证多个线程不会同时试图读取和修改那个资源这要求技巧性地运用synchronized(同步)关键字它是一个有用的工具但必须真正掌握它因为假若操作不当极易出现死锁
除此以外运用线程时还要注意一个非常特殊的问题由于根据Java的设计它允许我们根据需要创建任意数量的线程——至少理论上如此(例如假设为一项工程方面的有限元素分析创建数以百万的线程这对Java来说并非实际)然而我们一般都要控制自己创建的线程数量的上限因为在某些情况下大量线程会将场面变得一团糟所以工作都会几乎陷于停顿临界点并不象对象那样可以达到几千个而是在以下一般情况下我们只创建少数几个关键线程用它们解决某个特定的问题这时数量的限制问题不大但在较常规的一些设计中这一限制确实会使我们感到束手束脚
大家要注意线程处理中一个不是十分直观的问题由于采用了线程调度机制所以通过在run()的主循环中插入对sleep()的调用一般都可以使自己的程序运行得更快一些这使它对编程技巧的要求非常高特别是在更长的延迟似乎反而能提高性能的时候当然之所以会出现这种情况是由于在正在运行的线程准备进入休眠状态之前较短的延迟可能造成sleep()结束调度机制的中断这便强迫调度机制将其中止并于稍后重新启动以便它能做完自己的事情再进入休眠状态必须多想一想才能意识到事情真正的麻烦程度
本章遗漏的一件事情是一个动画例子这是目前程序片最流行的一种应用然而Java JDK配套提供了解决这个问题的一整套方案(并可播放声音)大家可到的演示区域下载此外我们完全有理由相信未来版本的Java会提供更好的动画支持——尽管目前的Web涌现出了与传统方式完全不同的非Java非程序化的许多动画方案如果想系统学习Java动画的工作原理可参考《Core Java——核心Java》一书由Cornell&Horstmann编着PrenticeHall于年出版若欲更深入地了解线程处理请参考《Concurrent Programming in Java——Java中的并发编程》由Doug Lea编着AddisonWiseley于年出版或者《Java Threads——Java线程》Oaks&Wong编着OReilly于年出版