我创建了一个小的虚拟程序,测试Java线程调度: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运行时环境(建立1.8.0_40-B26)
爪哇热点(TM)64位服务器VM(建立25.40-B25,混合模式)
良好的通话时间测量计划所需的时间:在线程11之后,它从大约1ms跳到~15ms,然后随着线程数量的增加而继续上升! – Almog
听起来就像调度时间明显增加。然而,其中一些时间可能会用于创建线程本身 - 但您可以考虑在当前for循环之外初始化所有线程,并且仅在循环中调用“start”方法。这样你就知道你的测量不受构造函数调用的影响。 – CodeBlind