background image

Java 并发编程:线程

从一开始 Java 就被设计成支持并发编程的语言,java 语言及其核心类库都有对并发编
程的支持。从 5.0 开始,Java 平台引入了一些高层的并发接口。本系列文章将尽可能的概
括这些内容。
  进程与线程
  并发编程模式中,有两个基本执行单元:进程与线程。进程和线程是现代操作系统的
基本概念。一个进程拥有独立完备的执行环境,进程拥有私有的计算机资源,比如独立的
内存空间、代码段、指令寄存器等等。进程在操作系统中基本等同于应用程序。最终用户看
到的独立程序有可能是多个互相协作的进程,为了方便进程之间的通信,大多数操作系
统支持进程间通信(Inter Process Communication, IPC)资源,比如管道和端口。IPC 往
往不仅仅在同一台计算机系统上使用,也往往运用于不同计算机系统之间的通信。
  线程通常也称轻量级进程,线程拥有的资源比进程的要少。线程只存在于进程中,一
个进程可以包含多个线程。比如一个 Java 程序中可以有多个线程存在。线程不拥有独立的
内存空间,而是和同进程内的其他线程共享进程的内存空间。由于线程共享进程的资源
(内存或者打开的文件),同进程的线程之间往往需要大量的互斥和同步,保证资源使用
的可确定性。这在前面文章中已经说过,资源共享是并发编程中同步和互斥的根源。
  由于进程的特性,使得它们之间资源共享的冲突比较少,因此并发编程主要是针对
线程的,多线程编程是 Java 程序的基本特征。因此这儿讲的并发编程主要是针对 Java 线
程编程的。
  Java 线程
  简单来说,每个 Java 线程都有一个 Thread 实例与之对应。创建线程对象的方法通
常有两种:
  1.直接创建和管理,也就是每当程序需要异步执行任务时就实例化一个 Thread 对
象,然后自己管理其生命周期。
    2. 抽 象 线 程 管 理 , 使 其 从 程 序 代 码 中 分 离 开 来 。 这 些 接 口 在 java 5 之 后 的
java.util.concurrency 包中提供。
  我们先讨论第一种方式,java.util.concurrency 包提供的高层工具我们在后面的文
章再讨论。
  第一种方式创建线程非常直接,有两种方法可以创建一个线程实例:
  1.生成一个 Runnable 对象,并将它传递给 Thread 对象。
1 public class HelloWorld implements Runnable {
2     public void run() {
3         System.out.println("Hello World");
4     }
5     public static void main(String args[]) {
6         (new Thread(new HelloWorld())).start();
7     }
8 }