前面各章节的程序在运行时,一个程序只有一条执行线索。从线程的观点看,这是单线程的程序。然而现实世界里的很多过程都具有多条线索同时执行的特征。例如,我们可以一边喝咖啡,一边听音乐:一个网络服务器可能要同时处理几个客户机的请求等。如果将这些活动映射到计算机中,从线程的观点看,是多线程。
Java语言的多线程机制为模拟这类问题提供了一个很好的环境。每个Java程序都可以创建多个线程,每个线程可以完成一个相对独立的任务,且能够与其他线程并行执行。例如,当从网络服务器上下载一个非常耗时的文件时,CPU资源被占用的时间非常少。如果是单线程环境,一次只能运行一个任务,只有前一个任务完成后,才能开始执行下一个任务,这就浪费了CPU资源。在Java的多线程环境下,可以有多个线程同时运行,当一个线程暂时不需要CPU时,另一个线程就可以占用CPU资源。所以,多线程机制有助于充分利用CPU资源,提高程序的运行效率。本章将详细介绍Java语言的多线程技术,包括线程和进程的概念、创建线程、线程的调度和线程的同步等内容。
8.1 线程的概念
8.1.1 线程和进程
要理解线程,我们首先来了解进程。进程是程序的动态执行过程,每一个进程都占有独立的内存空间、独立的内部数据、独立的系统资源。多进程是指在操作系统中能同时运行多个程序。这些进程之间相互独立,一个进程一般不允许访问其他进程的内存空间,因此,进程间通信非常困难。例如,在Windows操作系统中,同时运行的“计算器”程序和“IE浏览器”可以理解为两个进程。
线程与进程类似,是一段完成某个特定功能的代码,但线程是比进程更小的执行单位。与进程不同,同一个类的多个线程是共享一块内存空间和一组系统资源,这样,多个线程间切换时,负担要比进程小得多,正因如此,线程被称为轻量级进程。
概括地说,一个进程在其执行过程中,可以产生多个线程。每个线程是进程内部单一的一个执行流。多线程指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。在基于线程的多任务处理环境中,线程是*小的处理单位。一个进程内的多个线程可以共享一块内存空间和一组系统资源,有可能互相影响。线程的切换比进程的切换负担要小。
……