線程睡眠:Thread.sleep()方法


public class ThreadSleep extends Thread 
{
public void run(){
for(int a=0;a<50;a++){
try{Thread.sleep(500);}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+" : "+a);
}
}
public static void main(String[] args)
{
ThreadSleep t1=new ThreadSleep();
ThreadSleep t2=new ThreadSleep();
t1.start();
t2.start();
}
}
在java程序中要創建一個線程有兩種方法,一種是extends Thread;另一種是implements Runnable;
當然推薦使用implements Runnable這種方法,
但是當我們要在一個線程中使用sleep()方法時,如果使用extends Thread方法去創建類那么可以直接使用sleep()方法,如果使用的是implements Runnable創建類,那么必須是Thread.sleep()的格式,否則編譯器報錯。


   1.Thread.Sleep(XXXX)函數就是干這種事的,他告訴操作系統“在未來的多少毫秒內我不參與CPU競爭”。

 

   2.而Thread.Sleep(0)的作用,就是“觸發操作系統立刻重新進行一次CPU競爭”。

    競爭 的結果也許是當前線程仍然獲得CPU控制權,也許會換成別的線程獲得CPU控制權。這也是我們在大循環里面經

常 會寫一句Thread.Sleep(0) ,因為這樣就給了其他線程比如Paint線程獲得CPU控制權的權力,這樣界面就不會假死在那里。

 

 

 

補充: 1.在Windows原理層面,CPU競爭都是線程級的。

          2.操作系統中,CPU競爭有很多種策略。Unix系統使用的是時間片算法,而Windows則屬於搶占式的。 在時間  片算法中,所有的進程排成一個隊列。操作系統按照他們的順序,給每個進程分配一段時間,即該進程 允許運行的時間。如果在 時間片結束時進程還在運行,則CPU將被剝奪並分配給另一個進程。如果進程在時間片結束前阻塞或結束,則CPU當即進行切換。調度程 序所要做的就是維護一張就緒進程列表,,當進程用完它的時間片后,它被移到隊列的末尾。 所謂搶占式操作系統,就是說如果一個進程得到了 CPU 時間,除非它自己放棄使用 CPU ,否則將完全霸占 CPU 。因此可以看出,在搶 占式操作系統中,操作系統假設所有的進程都是“人品很好”的,會主動退出 CPU 。 在搶占式操作系統中,假設有若干進程,操作系統會根據他們的優先級、飢餓時間(已經多長時間沒有使用過 CPU 了),給他們算出一 個總的優先級來。操作系統就會把 CPU 交給總優先級最高的這個進程。當進程執行完畢或者自己主動掛起后,操作系統就會重新計算一 次所有進程的總優先級,然后再挑一個優先級最高的把 CPU 控制權交給他。

分享到:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM