我創建了一個小的虛擬程序,測試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