在我们开始讲多线程之前,我们先来了解一下什么是进程,什么是线程。进程和线程是操作系统中两个容易混淆的概念。
进程
在Windows操作系统中打开任务管理器,可以查看进程和线程的详细信息。也可以使用专业的进程查看小软件——Process Explorer来查看系统中的进程和线程,如下图所示:
在Windows操作系统中,进程被分为后台进程和应用进程两类。大部分后台进程在系统开始运行时被操作系统启动,完成操作系统的基础服务功能。大部分应用进程主要由用户启动,完成用户所需要的具体应用功能,比如听音乐、社交聊天、浏览网站等。
在操作系统(第4版)中,对进程的定义描述:所谓”进程“,是指一个程序在给定数据集合上的一次执行过程,是系统进行资源分配和运行调度的独立单位;简单来说,进程是程序的一次启动执行。
程序是一个在时间上严格有序的指令集合;简单来说,程序是存放在硬盘中的可执行文件,主要包括代码指令和数据。进程是程序的一次启动和执行,是操作系统将程序装入内存,给程序分配必要的系统资源,并且开始运行程序的指令。
进程是程序的一次执行过程,程序是进程赖以存在的基础。同一个程序可以多次启动,对应多个进程。
一般来说,一个进程由程序段、数据段和进程控制块三部分组成,如下图所示:
线程
随着计算机的发展,CPU的性能越来越高,线程的出现主要是为了充分发挥CPU的计算性能,提升CPU的硬件资源的利用率,同时弥补进程调度过于笨重产生的问题。
线程是指“进程代码段”的一次的顺序执行流程。进程是操作系统资源分配的最小单元,而线程是CPU调度的最小单位。
Java程序的进程执行过程就是标准的多线程的执行过程。每当使用Java命令执行一个class类时,实际上就是启动了一个JVM进程。理论上,在该进程的内部至少会启动两个线程,一个main线程,另一个是GC(垃圾回收)线程。如下图所示:
一个标准的线程主要由三部分组成,即线程描述信息、程序计数器(Program Counter,PC)和栈内存,如下图所示:
THread类
一个线程在Java中使用一个Thread实例来描述。Thread类是Java语言一个重要的基础类,位于java.lang包中。
线程的启动、运行、调度和生命周期管理高度依赖于操作系统,java本身不具备与底层操作系统交互的能力。因此线程的底层操作都使用了native方法,在创建Thread类实例,首先会执行registerNatives()方法调用函数库的底层线程注册方法,源码如下:
private static native void registerNatives();static {registerNatives();}