在常用的操作系統中,Unix系統使用的是時間片算法來處理進程,所謂的時間片算法,就是所有進程排成一個隊列。操作系統按照他們的順序,每個進程分配一段時間,如果在時間片結束時進程還在執行,那么CPU就會被強行剝奪並分配給另一個進程,如果進程在時間片結束前阻塞或者結束,則CPU當即進行切換。調度程序要做的就是維護一張就緒進程表,當進程用完他的時間片之后,就會被移到末尾。
而Windows使用的是搶占式,也就是說一個進程如果得到了CPU時間,除非他放棄使用CPU,否則將完全霸占CPU。在windows中,假設有若干進程,操作系統會根據他們的優先級,飢餓時間(已經多長時間沒有使用過CPU)給他們算出一個總的優先級。操作系統就會把CPU交給總優先級最高的這個進程。當進程執行完畢或者自己主動掛起,操作系統就會重新計算一次所有就緒進程的總優先級,再挑一個優先級最高的把CPU控制權交給他。
現在對於搶占式系統有一個問題,如果現在有10個進程,1號進程總優先級最高且高出其他線程一大截,那么1號線程會先使用cpu,當他使用完一會兒之后,阻塞了(比如io讀取數據,cpu的計算是相當快的,反而io讀取數據會顯得很慢)他決定掛起。當他掛起之后,系統又對所有的進程進行了優先級排序。因為1號剛執行過,飢餓度低於其他進程,但由於優先級太高,此次總優先級還是1號進程最高(可能只比其他進程高一點了),所以這次cpu還是交給1號進程來使用。1號進程使用cpu之后被告知,需要io讀取的數據還是沒有讀取到。這樣一來就耽誤了時間。這時候可以使用Thread.sleep(毫秒數)來告訴操作系統,我需要的數據還沒來,我在多長時間里不參與競爭。(即使毫秒數已經到達,1號線程也不會立刻執行,因為這時候cpu可能被其他進程使用,其他進程掛起/結束之后,也要等操作系統重新計算優先級來分配)。 (實際上操作系統會監控進程,如果進程長時間控制cpu,會被強制掛起)
Thread.sleep(0)的意義為通知操作系統立即重新進行一次CPU競爭。競爭的結果還是要依賴優先級來決定。