Я создал небольшую фиктивную программу, которая проверяет 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?
Более подробная информация о том, что может происходить под капотом, особенно ценится!
ява версия "1.8.0_40"
Java (TM) SE Runtime Environment (сборка 1.8.0_40-b26)
Java HotSpot (TM) 64-разрядный сервер VM (сборка 25,40-B25, смешанная mode)
Хороший призыв к измерению времени, необходимого для планирования: после Thread 11 он перескакивает от 1 мс до ~ 15 мс, а затем продолжает увеличиваться по мере увеличения количества потоков! – Almog
Похоже, что есть определенное увеличение времени планирования. Некоторое время можно было бы использовать для создания самого потока - вы можете рассмотреть возможность инициализации всех ваших потоков за пределами текущего цикла for и только вызов метода «start» в цикле. Таким образом, вы знаете, что на ваши измерения не влияет вызов конструктора. – CodeBlind