我正试图了解有关其调度和线程相似性的Java内部原理。
问题是:
给定一个无限循环,在多核环境(例如8)中的线程上运行:
while(true) Thread.sleep(1000);
1)此操作是否总是在同一物理线程上运行?
2)有某种亲和力吗?
3)如果它并不总是在同一CPU上运行,那么JVM如何决定将执行切换到新的CPU?
4)有什么方法可以验证此行为?
(非常感谢)JVM不负责安排线程时间,因为Java线程与本地线程是同构的(即1:1)。因此,操作系统计划Java线程运行的时间,并且操作系统管理线程的亲和力(并且如果您希望以任何方式影响它,则必须使用本机代码)。至少有one library提供了这种机制,但我从未使用过。
我很感谢地说,因为很早以前,JVM使用green threads并对其进行协作管理。对于多个cpus /内核,它的速度要慢得多。