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

标签 java multithreading cpu affinity

我正在尝试了解 Java 的调度和线程关联的内部机制。

问题是:

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

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

  2. 有某种亲和性吗?

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

  4. 有什么方法可以验证此行为吗?

最佳答案

幸运的是,JVM 不负责调度线程时间,因为 Java 线程与 native 线程是同构的(即 1:1)。因此,操作系统会安排 Java 线程运行的时间,并且操作系统会管理线程关联性(如果您希望以任何方式影响它,则必须使用 native 代码)。至少有one library提供了这样的机制,但我从来没有使用过。

我说谢天谢地,因为很久以前,JVM使用green threads并对其进行合作管理。对于多个 cpu/核心来说,速度要慢得多。

关于Java:循环的 Thread.sleep() 总是在同一个物理核心上运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60012199/

相关文章:

java - JSP 输出在 tomcat 8.0.17 中被截断

java - 使用内部服务器使用 springmvc 和 eclipse 创建和调试应用程序

Python 和线程 : instance has no __call__ method

multithreading - servlet多线程

java - : System. arraycopy 或 Arrays.copyOf 哪个更有效?

java - 轮询服务器以在 Java 客户端中获取数据的替代方案?

C# 字典索引超出带锁的数组范围

java - Java中如何获取处理器组的数量?

java - 如何获取特定应用程序的 CPU 值

时钟、rdtsc 和 CLOCKS_PER_SEC