并发
计算机用户想当然地认为他们的系统一次可以做不止一件事,他们设想他们可以继续在文字处理器中工作,而其他应用程序则下载文件、管理打印队列和流音频,即使是单个应用程序通常也希望一次完成多个任务。例如,流式音频应用程序必须同时从网络上读取数字音频、解压缩、管理回放并更新其显示,甚至文字处理器应始终准备好响应键盘和鼠标事件,无论重新格式化文本或更新显示有多繁忙,可以执行此类操作的软件称为并发软件。
Java平台的设计初衷是为了支持并发编程,在Java编程语言和Java类库中提供基本的并发支持,从5.0版开始,Java平台还包含高级并发API,本课程介绍了平台的基本并发支持,并总结了java.util.concurrent包中的一些高级API。
进程和线程
在并发编程中,有两个基本的执行单元:进程和线程,在Java编程语言中,并发编程主要涉及线程,但是,进程也很重要。
计算机系统通常具有许多活动进程和线程,即使在只有单个执行核心的系统中也是如此,因此在任何给定时刻只有一个线程实际执行,单个核心的处理时间通过称为时间切片的OS功能在进程和线程之间共享。
对于具有多个处理器或具有多个执行核心的处理器的计算机系统变得越来越普遍,这极大地增强了系统并发执行进程和线程的能力 — 但即使在没有多个处理器或执行核心的简单系统上,并发也是可能的。
进程
进程具有独立的执行环境,进程通常具有完整的私有基本运行时资源集,特别是,每个进程都有自己的内存空间。
进程通常被视为程序或应用程序的同义词,但是,用户看作的单个应用程序实际上可能是一组协作进程,为了促进进程之间的通信,大多数操作系统都支持进程间通信(IPC)资源,例如管道和socket,IPC不仅用于同一系统上的进程之间的通信,还用于不同系统上的进程。
Java虚拟机的大多数实现都作为单个进程运行,Java应用程序可以使用ProcessBuilder对象创建额外进程,多进程应用程序超出了本课程的范围。
线程
线程有时被称为轻量级进程,进程和线程都提供执行环境,但创建新线程所需的资源比创建新进程要少。
线程存在于进程中 — 每个进程至少有一个线程,线程共享进程的资源,包括内存和打开文件,这使高效但可能有问题的通信。
多线程执行是Java平台的基本特性,每个应用程序至少有一个线程 — 或几个,如果你计算执行内存管理和信号处理等任务的“系统”线程的话。但是从应用程序员的角度来看,你只从一个线程开始,称为主线程,该线程具有创建额外线程的能力,我们将在下一节中进行演示。