0%

java | 线程运行原理

简单的介绍一下相关原理。

栈和栈帧

每个栈是由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存。

每个线程只能有一个活动栈帧,对应着当前正在执行的的那个方法。

图中,一共有 3 个方法。

  • 可以看到三个方法,分别对应 3 个 Frame
  • test1 有两个语句,但是,也只有 1 个 Frame
  • 如果 test2 执行完毕,返回后,那么,左侧的 Frame 也只剩下两个,即执行完之后,Frame 就被释放了
  • 另外,注意图中的进入方式,是栈的方式

多线程

debug 模式调为 Thread 模式,然后,图中是,将 t1 线程 debug 到图中位置。

从图上可以得出的结论是

  • 多线程的栈帧都是独立的

线程的上下文切换 context switch

以下原因导致 cpu 不能执行当前的线程,转而执行另一个线程的代码

  • 线程的 cpu 时间片用完
  • 垃圾回收
  • 有更高级的线程需要运行
  • 线程自己调用了 sleepyieldwaitjoinparksynchronizedlock等方法

context switch 发生时。需要由操作系统保存当前线程的状态,并恢复另一个线程的状态。Java 对应的概念是程序计数器(Program Counter Register),它的作用是记住下一条 jvm 的执行地址,是线程私有的。

状态包括

  • 程序计数器
  • 虚拟机栈中的每个栈帧的信息
    • 局部变量、操作数栈、返回地址等
请我喝杯咖啡吧~