Java线程与Tomcat等应用服务器线程的并行运行机制疑问
关于Java线程多核并行能力的解答
首先明确结论:Tomcat的请求线程完全可以在多个CPU核心上实现真正的并行运行,《Head First Java》中的描述存在特定前提限制,不适用于现在的主流Java运行环境。
为什么书中会有“Java线程无法并行”的说法
拥有多个调用栈时,你会获得多任务同时运行的观感。实际上,只有真正的多处理器系统才能同时执行多项任务,Java线程只能模拟出多任务同时运行的效果。
这段描述对应的是JDK 1.1及更早版本的实现逻辑:当时的Sun JDK采用**绿色线程(用户态线程)**实现Java线程,所有线程的调度由JVM自身完成,操作系统只能感知到JVM这一个进程,自然不会把它调度到多个核心上运行,所有Java线程只能在单个核心上切换调度,只能模拟并发,无法实现并行。
当前主流JVM的线程实现逻辑
从JDK 1.2版本开始,Windows、Linux、macOS等主流平台的HotSpot虚拟机已经全部弃用绿色线程,改用内核态线程模型:
- 每一个Java线程,底层直接对应一个操作系统原生线程
- 线程的调度权完全交给操作系统内核,JVM本身不干预线程调度逻辑
- 操作系统可以根据CPU负载情况,将同一个JVM进程下的不同线程分配到不同CPU核心上执行,完全支持真正的并行运行
Tomcat请求线程的运行逻辑
Tomcat用于处理用户请求的工作线程就是标准的Java线程,没有做特殊的调度改造:
- 如果运行Tomcat的服务器是多核CPU,操作系统会自动将不同的请求线程调度到空闲核心上并行执行
- 你可以通过压测验证:部署一个CPU密集型的测试接口,用压测工具发起大量并发请求,观测服务器的CPU监控,会看到多个CPU核心的使用率同时上升,即可证明线程是并行运行的。
内容的提问来源于stack exchange,提问作者Vishnupriya
相关产品推荐
相关产品推荐

