多线程的基础知识

多任务有两种不同的类型:基于进程的多任务和基于线程的多任务.理解两者的不同是十分重要的.进程本质上是正在执行的程序.因此,基于进程的多任务是允许计算机同时运行两个或多个程序的功能.例如,允许在运行Java编译器的同时使用文本编辑器或浏览Internet就是基于进程的多任务.在基于进程的多任务中,程序是调度程序(scheduler)可以分派的最小代码单元.
在基于线程的多任务环境中,线程是最小的可分派代码单元.这就意味着程序一次可以执行两项或多项任务.例如,文本编辑器可以在打印的同时格式化文本,只要这两个动作是由两个单独的线程执行的就可以.尽管Java程序使用基于进程的多任务环境,但是基于进程的多任务并不受Java的控制.基于多线程的多任务也是如此.
多线程的主要优势就是可以编写出非常高效的程序,因为他会让你利用大多数程序中出现的空闲时间.你可能知道,多数IO设备,无论是网络端口,磁盘驱动器,还是键盘,速度都比CPU慢.因此,程序经常要花费大部分执行时间用于等待向设备发送或从设备接口信息.通过使用多线程,程序可以在这些空闲时间执行其他任务.例如,当程序的一部分正向internet发送文件时,另一部分就可以读取键盘输入,还有一部分依然可以将下一个要发送的数据块存入缓冲区.
你可能知道,在过去几年中,多处理器和多核系统已经十分常见.当然,单处理器系统的使用仍然十分广泛.Java的多线程功能在这两类系统中都可以工作,理解这一点十分重要.在单核系统中,并发执行的线程共享CPU,每个线程都收到一个CPU时间片,因此,在单核系统中,实际上两个或更多个线程并不是同时运行的,而是利用了空闲的CPU时间.但是,在多核处理器/多核系统中,两个或更多个线程实际上可以同时执行.在很多情况下,这可以进一步提高程序效率,提高特定操作的速度.
线程有多种状态,可以处于运行状态(running),可以处于就绪状态(ready to run),一旦得到CPU时间就可以执行.正在执行的线程可以被挂起(suspended),即暂停执行.稍后可以继续执行(resumed).线程在等待资源时可以处于阻塞状态(blocked).线程在执行结束,且不能继续执行时可以终止(terminated).
基于线程的多任务的出现产生了对同步(synchronization)这一特殊类型功能的需求.同步允许线程以某种定义良好的方式协调执行.Java有专门用于同步的完整的子系统,他的主要功能在此也将进行介绍.
如果为windows等操作系统编写过程序,那么就已经熟悉多线程程序设计了.然而Java通过语言元素来管理线程这一事实使得编写多线程程序特别方便.许多细节都为你处理过了.