Java如何绑定线程到指定CPU上执行?
java线程模型
主流虚拟机如hotspot线程模型基本都是1:1,即一个用户线程对应着一个系统线程
一个 Java 线程是直接映射为一个操作系统原生线程的,中间没有额外的间接结构。HotSpot 虚拟机也不干涉线程的调度,这事全权交给底下的操作系统去做。
顶多就是设置一个线程优先级,操作系统来调度的时候给个建议。
但是何时挂起、唤醒、分配时间片、让那个处理器核心去执行等等这些关于线程生命周期、执行的东西都是操作系统干的。
内核线程和用户线程的关系
ps:用户线程是指逻辑线程
- LWP:Light Weight Process 轻量级进程
- KLT:Kernal-Level Thread 内核线程
- UT:User Thread 用户线程


程序一般来说不会直接使用内核线程,而是使用内核线程的一种高级接口,即轻量级进程(LWP),轻
量级进程就是我们通常意义上说的线程。
为什么不直接使用内核线程:https://chatgpt.com/s/t_688a3269bab881919cc8b77012464e77
正因为有了内核线程的支持,每个轻量级进程成了独立的调度单元,即使某个轻量级进程阻塞了,也不会
影响到其他轻量级进程的
但他也有局限性,即他属于内核空间的东西,用户线程的创建,切换,销毁都需要用户态和内核态来回切
换,挺耗时的。其次就是那个内核空间有限,轻量级进程要消耗一定的内核资源(如内核线程的栈空 间),因此一个系统支持轻量级进程的数量是有限的
绑核实践
绑定线程是操作系统层面干的,即使Java能干,那也只是套层皮而已
使用某位大佬开发的一个库,本质是封装了Linux的taskset指令来要求os为我们的用户线程判定特定cpu
1 | <dependency> |
jna:JNA 是一个让你可以在 Java 中直接调用 C 系统函数 / 本地库的工具,不用写 JNI,使用简单灵活,
是 Java 调用底层的一把利器。
好处:
减少上下文切换和缓存失效率
谁在使用?
可用于netty
