JUC并发编程 线程运行原理 -- 多线程 & 上下文切换
Posted Z && Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUC并发编程 线程运行原理 -- 多线程 & 上下文切换相关的知识,希望对你有一定的参考价值。
1. 多线程运行原理
测试代码:
public class TestFrames {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
method1(20);
}
}, "t1").start();
method1(10);
}
private static void method1(int x) {
Object m = method2();
System.out.println("x = " + x);
System.out.println("m = " + m);
}
private static Object method2() {
return new Object();
}
}
我们先打在2个线程运行的地方打上断点:
然后选择debug 注意: 这里选择的是Thread
debug结果:
结论:
- 每个线程都有自己独立的栈内存,互不干扰,这就是多线程运行原理
2. 上下文切换原理
上下文切换原理概述:
因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码:
- 线程的 cpu 时间片用完(被动)
- 垃圾回收(被动)
- 有更高优先级的线程需要运行(被动)
- 线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方法(主动)
当 Context Switch 发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),它的作用是记住下一条 jvm 指令的执行地址,是线程私有的:
- 状态包括程序计数器、虚拟机栈中每个栈帧的信息,如局部变量、操作数栈、返回地址等
- Context Switch 频繁发生会影响性能
上下文切换原理图解
注意: 在切换时会保存原线程的信息
以上是关于JUC并发编程 线程运行原理 -- 多线程 & 上下文切换的主要内容,如果未能解决你的问题,请参考以下文章
JUC并发编程 多线程设计模式 -- 同步模式之保护性暂停(join方法原理 & 保护性暂停-扩展-解耦等待和生产)
JUC并发编程 多线程设计模式 -- 同步模式之顺序控制( 固定运行顺序 & 交替输出)