如果可執行的執行緒數大於CPU的數量,那麼OS最終會強行換出正在執行的執行緒,從而使其他執行緒能夠使用CPU。
這會引起上下文切換,它會儲存當前執行執行緒的執行上下文,並重建新調入執行緒的執行上下文。
切換上下文是要付出代價的;執行緒的排程需要操控OS和JVM中共享的資料結構。
你的程式與OS、JVM使用相同的CPU;CPU在JVM和OS的程式碼花費越多時間,意味著用於你的程式的時間就越少。但是JVM和OS活動的花費並不是切換上下文開銷的唯一來源。
當一個新的執行緒被換入後,它所需要的資料可能不在當前處理器本地的快取中,所以切換上下文會引起快取缺失的小恐慌,因此執行緒在第一次排程的時候會執行得稍慢一些。
即使有很多其他正在等待的執行緒,排程程式也會為每一個可執行的執行緒分配一個最小執行時間的定額。
就是因為這個原因:它分期償付切換上下文的開銷,獲得更多不中斷的執行時間,從整體上提高了吞吐量(以損失響應性為代價)。