Java如何绑定线程到指定CPU上执行?

本文探讨了Java线程与操作系统线程模型的关系,重点在于Java如何实现线程绑定到特定CPU核心执行。Java本身并不直接支持这个功能,但在Linux上可以借助taskset命令或Java-Thread-Affinity库来实现。Java-Thread-Affinity是一个开源项目,通过JNA调用操作系统API来绑定线程,避免上下文切换,提高性能。文章还介绍了相关项目和实际应用案例。
摘要由CSDN通过智能技术生成

不知道你是啥感觉,但是我第一次看到这个问题的时候,我是懵逼的。

而且它还是一个面试题。

我懵逼倒不是因为我不知道答案,而是恰好我之前在非常机缘巧合的情况下知道了答案。

我感觉非常的冷门,作为一个考察候选者的知识点出现在面试环节中不太合适,除非是候选者主动提起做过这样的优化。

而且怕就怕面试官也是恰巧在某个书上或者博客中知道这个东西,稍微的看了一下,以为自己学到了绝世武功,然后拿出去考别人。

这样不合适。

说回这个题目。

正常来说,其实应该是属于考察操作系统的知识点范畴。

但是呢,和这位同学聊的时候,他说面试官呢又特定的加了“在 Java 中如何实现”,似乎没想着从操作系统的角度去

那我们就聊聊这个问题。

Java线程

在聊如何绑定之前,先铺垫一个相关的背景知识:Java线程的实现。

其实我们都知道 Thread 类的大部分方法都是 native 方法:

在 Java 中一个方法被声明为 native 方法,绝大部分情况下说明这个方法没有或者不能使用平台无关的手段来实现。

说明需要操作的是很底层的东西了,已经脱离了 Java 语言层面的范畴。

抛开 Java 语言这个大前提,实现线程主要是有三种方式:

1.使用内核线程实现(1:1实现)

2.使用用户线程实现(1:N实现)

3.使用用户线程加轻量级进程混合实现(N:M实现)

这三种实现方案,在《深入理解Java虚拟机》的 12.4 小节有详细的描述,有兴趣的同学可以去仔细的翻阅一下。

总之,你要知道的是虽然有这三种不同的线程模型,但是 Java 作为上层应用,其实是感知不到这三种模型之间的区别的。

JVM 规范里面也没有规定,必须使用哪一种模型。

因为操作系统支持是怎样的线程模型,很大程度上决定了运行在上面的 Java 虚拟机的线程怎样去映射,但是这一点在不同的平台上很难达成一致。

所以JVM 规范里面没有、也不好去规定 Java 线程需要使用哪种线程模型来实现。

同时关于本文要讨论的话题,我在知乎上也找到了类似的问题:

https://www.zhihu.com/question/64072646/answer/216184631

这里面有一个R大的回答,大家可以看看一下。

他也是先从线程模型的角度铺垫了一下。

我这里主要说一下使用内核线程实现(1:1实现)的这个模型。

因为我们用的最多的 HotSpot 虚拟机,就是采用 1:1 模型来实现 Java 线程的。

这是个啥意思呢?

说人话就是一个 Java 线程是直接映射为一个操作系统原生线程的,中间没有额外的间接结构。HotSpot 虚拟机也不干涉线程的调度,这事全权交给底下的操作系统去做。

顶多就是设置一个线程优先级,操作系统来调度的时候给个建议。

但是何时挂起、唤醒、分配时间片、让那个处理器核心去执行等等这些关于线程生命周期、执行的东西都是操作系统干的。

这话不是我说的,是R大和周佬都说过这样的话。

https://www.zhihu.com/question/64072646/answer/216184631
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值