什么是线程
在说线程是什么之前,有必要说下什么是进程,因为线程是进程的一个实体,线程本身是不会独立存在的。
进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
线程是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程是共享进程的资源
操作系统在分配资源时是把资源(除CPU之外的资源)分配给进程的,CPU资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以线程是CPU分配的基本单位
main线程
在Java中,当我们启动main函数时其实就启动了一个JVM的进程,而main函数所在的线程就是这个进程中的一个线程,也称为主线程
下面来验证上面那句话
看段代码
public class MainThread {
public static void main(String[] args) {
try {
Thread.sleep(1000 * 300L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
使用jps查看当前的java进程
使用jconsole 进程id 查看当前进程情况
查看main线程
进程和线程的关系
首先看张图
由上图可以看出,一个进程中可以有多个线程,多个线程共享进程的堆和方法区资源,每个线程有自己的程序计数器和栈区域
程序计数器是一块内存区域,用来记录线程当前要执行的指令地址,那么这个程序计数器为什么要线程私有呢?那是因为线程是占用CPU执行的基本单位,而CPU一般是使用时间片轮转的方式让线程轮询占用的,所以当前线程CPU时间片用完后,要让出CPU,等下次轮到自己的时候再执行,那么问题来了,如何知道之前程序执行到了哪里了呢?其实程序计数器就是为了记录该线程让出CPU时的执行地址的,待再次分配到时间片时线程就可以从自己私有的计数器指定地址继续执行
每个线程都有自己的栈资源,用来存储该线程的局部变量,这些局部变量是该线程私有的,其他线程是访问不了的,除此之外栈还用来存放线程的调用栈帧
堆是一个进程中最大的一块内存,堆是被进程中所有线程共享的,是进程创建时分配的,堆里面主要存放使用new操作创建的对象实例
方法去则用来存放JVM加载的类、常量及静态变量等信息,也是线程共享的