thread.sleep的作用是什麼:
(一)CPU競爭策略
#在作業系統中,CPU競爭有很多策略,Unix系統採用的是時間片演算法,而Windows採用的是搶佔式的。
(1).
在時間片演算法中,所有的行程都排成一個佇列。作業系統按照他們的順序,給每個進程分配一段時間,也就是該進程允許運行的時間。如果在 時間片結束時進程還在運行,則CPU將被剝奪並分配給另一個進程。如果進程在時間片結束前阻塞或結束,則CPU當即進行切換。調度程 序所要做的就是維護一張就緒行程列表,,當行程用完它的時間片後,它被移到佇列的末端。
(2).
搶佔式作業系統,就是說如果一個行程得到了 CPU 時間,除非它自己放棄使用 CPU ,否則將完全霸佔 CPU 。因此可以看出,在搶佔式作業系統中,作業系統假設所有的進程都是「人品很好」的,會主動退出 CPU 。在搶佔式作業系統中,假設有若干進程,作業系統會根據他們的優先權、飢餓時間(已經多久沒有使用過 CPU 了),給他們算出一 個總的優先權來。作業系統就會把 CPU 交給總優先權最高的這個行程。當行程執行完畢或自己主動掛起後,作業系統就會重新計算一次所有行程的總優先權,然後再挑一個優先級最高的把 CPU 控制權交給他。
(二)據上所述,總結Thread.Sleep()的作用就是告訴作業系統「在未來的毫秒內我不參與CPU競爭」;
那麼有兩個問題:
(1).Thread.Sleep(0)的作用是啥?
Thread.Sleep(0)的作用就是「觸發作業系統立刻重新進行一次CPU競賽」。競爭的結果也許是當前執行緒仍然獲得CPU控制權,也許換成別的執行緒取得CPU控制權。這也是我們在大循環裡面常常會寫一句Thread.Sleep(0) ,因為這樣就給了其他線程比如Paint線程獲得CPU控制權的權力,這樣界面就不會假死在那裡。
(2).假設現在呼叫了Thread.Sleep(1000),那麼在1秒以後這個執行緒一定會被喚醒麼?
答案是:不一定。因為你只是告訴作業系統:在未來的1000毫秒內我不想再參與CPU競賽。那麼1000毫秒過去之後,這時候也許另外一個執行緒正在使用CPU,那麼這時候作業系統是不會重新分配CPU的,直到那個執行緒掛起或結束;況且,即使這個時候剛好輪到作業系統進行CPU 分配,那麼當前執行緒也不一定就是總優先權最高的那個,CPU還是可能被其他執行緒搶佔去。
推薦教學: 《java教學》
#以上是thread.sleep的作用是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!