gpt4 book ai didi

Java线程调度: More busy wait threads than processors?

转载 作者:行者123 更新时间:2023-11-30 08:37:59 25 4
gpt4 key购买 nike

我创建了一个测试 Java 线程调度的小虚拟程序:

  @Test
public void testThreadScheduling() throws Exception {
int nprocs = Runtime.getRuntime().availableProcessors();
System.out.println(String.format("I have %s processors available", nprocs));

// schedule more threads than I have processors
for (int i = 0; i < nprocs + 5; i++) {
final int thread = i;
new Thread((() -> {
System.out.println(String.format("Thread %s has been scheduled", thread));
while (true) { /* busy wait */ }
})).start();

// wait a little before spawning the next thread
Thread.sleep(100);
}
}

现在它的输出(每次我运行它)完全一样:

I have 12 processors available
Thread 0 has been scheduled
Thread 1 has been scheduled
Thread 2 has been scheduled
Thread 3 has been scheduled
...
Thread 15 has been scheduled
Thread 16 has been scheduled

我认为这甚至可能发生的原因是因为操作系统(或 JVM)正在抢占已经超过其量程的线程,但是我的问题是它使用什么策略,是操作系统进行抢占还是 JVM?

如果能提供更多有关引擎盖下可能发生的事情的详细信息,我们将不胜感激!


Java 版本“1.8.0_40”
Java(TM) SE Runtime Environment (build 1.8.0_40-b26)
Java HotSpot(TM) 64 位服务器虚拟机(构建 25.40-b25,混合模式)

最佳答案

处理线程调度绝对是操作系统的工作。如何实际完成调度取决于 O/S,在某些情况下,如果 O/S 允许用户设置线程优先级标志,则取决于用户。

如果您有兴趣量化这是如何发生的,您可以测量 for 循环结束时实际耗时,并查看在第 12 个线程启动后每次迭代等待的时间是否明显长于 100 毫秒的 hibernate 时间。另一种选择是使用以下代码片段获取 JVM 的 ThreadMXBean 实例并细读其线程争用统计信息:

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
threadMXBean.setThreadContentionMonitoringEnabled(true);

//Then, use specific thread IDs to get contention info periodically:

int threadID = ... //you can use getId() on each thread you created
ThreadInfo info = threadMXBean.getThreadInfo(threadID);
info.getBlockedTime(); //returns millis
info.getWaitedTime(); //returns millis

如果您以纪元毫秒为单位跟踪线程的启动时间,则可以将它与最后两种方法结合使用,以了解该线程实际在 CPU 上运行与等待其他线程所花费的时间。我认为此 ThreadInfo 对象提供的测量与使用 synchronized 关键字和 Java Lock 对象严格相关,但是,所以它可能不是如果您的线程未被阻塞但被操作系统抢占,则准确评估您的操作系统正在做什么。您可以计算总的非等待/非阻塞时间,并将其与您的线程实际可用的运行时间进行比较,差值将为您提供您的线程被操作系统抢占的总时间。

我怀疑这可能不会为您提供您正在寻找的详细程度,但我认为这与您在不编写一堆 native 的、特定于 O/S 的代码和使用 JNI 的情况下所能获得的尽可能接近在您的 Java 程序中访问它。

关于Java线程调度: More busy wait threads than processors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36799497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com