Java多线程编程实战指南:设计模式篇(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 无处不在的线程

进程(Process)代表运行中的程序。如果我们把程序比作剧本,那么进程就是剧本对应的实际演出(比如,电影演出)。一个运行的Java程序就是一个进程。从操作系统的角度来看,线程(Thread)是进程中可独立执行的子任务。一个进程可以包含多个线程,同一个进程中的线程共享该进程所申请到的资源,如内存空间和文件句柄等。从Java虚拟机的角度来看,线程是进程中的一个组件(Component),它可以看作执行Java代码的最小单位。Java程序中的任何一段代码总在某个确定的线程中执行。Java虚拟机启动的时候会创建一个main线程,该线程负责执行Java程序的入口方法(main方法)。如清单1-1所示的代码展示了Java程序中的代码总是由某个确定的线程运行的。

清单1-1 Java代码的执行线程

如清单1-1所示的程序运行时输出如下:

从上面的输出可以看出,类JavaThreadAnywhere的main方法以及类Helper的doSomething方法都是由main方法负责执行的。

在多线程编程中,弄清楚一段代码具体是由哪个(或者哪种)线程去负责执行的很重要,这关系到性能问题、线程安全问题等。本书在后续章节中会体现这点。

Java中的线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。用户线程会阻止Java虚拟机的正常停止[1],即Java虚拟机正常停止前应用程序中的所有用户线程必须先停止;否则Java虚拟机无法停止。而守护线程则不会影响Java虚拟机的正常停止,即应用程序中有守护线程在运行也不影响Java虚拟机的正常停止。因此,守护线程通常用于执行一些重要性不是很高的任务,例如,监视其他线程的运行情况的任务。