1. 线程切换的本质与核心概念
作为一名Java开发者,理解线程切换的底层机制对于编写高性能并发程序至关重要。线程切换(Context Switch)是指操作系统内核暂停当前正在执行的线程,保存其运行状态,然后恢复另一个线程的运行状态并继续执行的过程。
在Java中,我们使用的线程(Thread类)实际上是操作系统原生线程的包装。当我们在Java中创建并启动一个线程时,JVM会通过操作系统API创建一个对应的内核线程(Kernel Thread)。这种1:1的线程模型意味着每个Java线程都直接对应一个操作系统线程。
提示:现代JVM(如HotSpot)默认使用1:1线程模型,即每个Java线程对应一个操作系统原生线程。这与新兴的虚拟线程(Project Loom)采用的M:N模型有本质区别。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程切换的触发机制
线程切换不是随机发生的,而是由特定条件触发的。理解这些触发条件有助于我们优化程序,减少不必要的线程切换。
2.1 时间片耗尽
操作系统调度器(如Linux的CFS)会给每个线程分配一个时间片(通常10-100ms)。当线程连续执行时间达到这个阈值时,会触发时钟中断,强制进行线程切换。这是最常见的情况。
2.2 主动让出CPU
线程可以主动放弃剩余时间片:
- 调用Thread.yield()
- 等待锁(synchronized或Lock)
- 执行阻塞式IO操作
- 调用Object.wait()或Condition.await()
2.3 中断和异常
硬件中断(如网络数据到达)或软件异常(如缺页异常)也会导致线程切换。
3. 线程切换的完整流程
让我们深入分析一个完整的线程切换过程。假设有两个线程Thread-A和Thread-B,Thread-A正在执行时被切换到Thread-B:
3.1 步骤1:中断触发
- 硬件时钟中断发生,CPU暂停当前指令执行
- CPU保存当前程序计数器(PC)和程序状态字(PSW)
- 跳转到预定义的中断处理程序(进入内核态)
3.2 步骤2:保存上下文
内核调度器执行:
- 保存通用寄存器(EAX, EBX等)
- 保存栈指针(ESP)和基址指针(EBP)
- 保存浮点寄存器状态
- 保存线程状态到TCB
