background image

Java 多线程初学者指南(5):join 方法的使用.....................................................11
Java 多线程初学者指南(6):慎重使用 volatile 关键字........................................13
Java 多线程初学者指南(7):向线程传递数据的三种方法.....................................15
Java 多线程初学者指南(8):从线程返回数据的两种方法.....................................18
Java 多线程初学者指南(9):为什么要进行数据同步............................................19
Java 多线程初学者指南(10):使用 Synchronized 关键字同步类方法...................22
Java 多线程初学者指南(11):使用 Synchronized 块同步方法.............................28
Java 多线程初学者指南(12):使用 Synchronized 块同步变量.............................31

Java 多线程初学者指南(1):线程简介

一、线程概述
    线程是程序运行的基本执行单元。当操作系统(不包括单线程的操作系统,如微软早
期的 DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少
建立一个线程(这个线程被称为主线程)来作为这个程序运行的入口点。因此,在操作
系统中运行的任何程序都至少有一个主线程。
    进程和线程是现代操作系统中两个必不可少的运行模型。在操作系统中可以有多个进
程,这些进程包括系统进程(由操作系统内部建立的进程)和用户进程(由用户程序建
立的进程);一个进程中可以有一个或多个线程。进程和进程之间不共享内存,也就是
说系统中的进程是在各自独立的内存空间中运行的。而一个进程中的线可以共享系统分
派给这个进程的内存空间。
    线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间
也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,
如线程执行函数中所定义的变量。
    注意:任何一个线程在建立时都会执行一个函数,这个函数叫做线程执行函数。也可
以将这个函数看做线程的入口点(类似于程序中的 main 函数)。无论使用什么语言或
技术来建立线程,都必须执行这个函数(这个函数的表现形式可能不一样,但都会有一
个这样的函数)。如在

Windows

用于建立线程的 API 函数 CreateThread 的第三个

参数就是这个执行函数的指针。
    在操作系统将进程分成多个线程后,这些线程可以在操作系统的管理下并发执行,从
而大大提高了程序的运行效率。虽然线程的执行从宏观上看是多个线程同时执行,但实
际上这只是操作系统的障眼法。由于一块 CPU 同时只能执行一条指令,因此,在拥有一
块 CPU 的计算机上不可能同时执行两个任务。而操作系统为了能提高程序的运行效率,
在一个线程空闲时会撤下这个线程,并且会让其他的线程来执行,这种方式叫做线程调
度。我们之所以从表面上看是多个线程同时执行,是因为不同线程之间切换的时间非常
短,而且在一般情况下切换非常频繁。假设我们有线程 A 和 B.在运行时,可能是 A 执行
了 1 毫秒后,切换到 B 后,B 又执行了 1 毫秒,然后又切换到了 A,A 又执行 1 毫秒。
由于 1 毫秒的时间对于普通人来说是很难感知的,因此,从表面看上去就象 A 和 B 同时
执行一样,但实际上 A 和 B 是交替执行的。
    二、线程给我们带来的好处
    如果能合理地使用线程,将会减少开发和维护成本,甚至可以改善复杂应用程序的性
能。如在 GUI 应用程序中,还以通过线程的异步特性来更好地处理事件;在应用

服务器