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
2
3
4
5
<dependency>
<groupId>net.openhft</groupId>
<artifactId>affinity</artifactId>
<version>3.2.3</version>
</dependency>

jna:JNA 是一个让你可以在 Java 中直接调用 C 系统函数 / 本地库的工具,不用写 JNI,使用简单灵活,

是 Java 调用底层的一把利器。

好处:

减少上下文切换和缓存失效率

谁在使用?

可用于netty