我正在尝试了解 Java 的调度和线程关联的内部机制。
问题是:
给定一个无限循环,在多核环境中的线程上运行(例如 8):
while(true) Thread.sleep(1000);
这个操作是否总是在同一个物理线程上运行?
有某种亲和性吗?
如果它并不总是在同一个 CPU 上运行,JVM 如何决定将执行实际切换到新的 CPU?
有什么方法可以验证此行为吗?
最佳答案
幸运的是,JVM 不负责调度线程时间,因为 Java 线程与 native 线程是同构的(即 1:1)。因此,操作系统会安排 Java 线程运行的时间,并且操作系统会管理线程关联性(如果您希望以任何方式影响它,则必须使用 native 代码)。至少有one library提供了这样的机制,但我从来没有使用过。
我说谢天谢地,因为很久以前,JVM使用green threads并对其进行合作管理。对于多个 cpu/核心来说,速度要慢得多。
关于Java:循环的 Thread.sleep() 总是在同一个物理核心上运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60012199/