1、线程的运行原理
我们都知道虚拟机是由:堆、栈、方法区等组成,那么其中的栈内存是给谁使用的呢?
1)、每个线程启动后,虚拟机就会为其分配一块栈内存
2)、每个栈由多个栈帧(Frame)组成,对应的就是每次方法调用时所占用的内存
3)、每个线程只能有一个活动的栈帧,对应着当前正在执行的那个方法
线程上下文切换
因为如下的一些原因导致CPU不再执行当前的线程,转而执行另一个线程的代码
1)、线程的cpu时间片用完了
2)、垃圾回收,有更高优先级的线程需要运行
3)、线程自己调用了sleep、yield、wait、join、park、synchronized、lock等方法。
当线程上下文发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,java中对应的概念就是程序计数器(program counter register),它的作用就是记住下一条jvm指令的执行地址,是线程私有的。
2、线程的状态
从java API层面来看,根据Thread.State枚举,线程分为6种状态
1)、新建状态(new)
创建了一个线程,但是还没有调用start()方法
如:通过Runnable接口创建一个线程类,new一个实例出来,线程就进入了初始状态