Java:循环 Thread.sleep() 是否总是在同一个物理内核上运行?

rod*_*odi 3 java cpu multithreading affinity

我试图了解 Java 内部关于它们的调度和线程关联性。

问题是:

给定一个无限循环,在多核环境(例如 8)中的线程上运行:

while(true) Thread.sleep(1000);
Run Code Online (Sandbox Code Playgroud)
  1. 这个操作是否总是在同一个物理线程上运行?

  2. 有什么缘分吗?

  3. 如果它并不总是在同一个 CPU 上运行,JVM 如何决定实际将执行切换到新的 CPU?

  4. 有什么方法可以验证这种行为?

Ell*_*sch 6

JVM(谢天谢地)不负责调度线程时间,因为 Java 线程与本机线程同构(即 1:1)。因此操作系统会在 Java 线程运行时进行调度,并且操作系统会管理线程关联(如果您希望以任何方式影响它,则必须使用本机代码)。至少有一个库提供了这种机制,但我从未使用过它。

谢天谢地,因为很久以前,JVM 使用绿色线程并协同管理它们。对于多个 CPU/内核,它要慢得多。