1. 程式人生 > >Java之sleep()方法與yield()方法的區別

Java之sleep()方法與yield()方法的區別

1.執行緒睡眠:sleep()方法
sleep() 使當前執行緒(即呼叫該方法的執行緒)暫停執行一段時間,讓其他執行緒有機會繼續執行(不理會其他執行緒的優先順序),並進入阻塞狀態,但它並不釋放物件鎖。噹噹前執行緒呼叫sleep()方法進入阻塞狀態後,在其睡眠時間段內,該執行緒不會獲得執行的機會,即使系統中沒有其他可執行的執行緒,處於sleep()狀態的執行緒也不會執行,因此sleep()方法常用來暫停程式的執行。查閱API文件,可以看到sleep()方法有兩種過載形式:
這裡寫圖片描述
下面程式通過呼叫sleep()方法來暫停主執行緒的執行,因為該程式只有一個主執行緒,當主執行緒進入睡眠後,系統沒有可執行的執行緒,所以可以看到程式在sleep()處暫停。

import java.util.Date;
public class sleepDemo 
{
    public static void main(String[] args) 
    {
        for(int i=0;i<10;i++)
        {
            System.out.println("當前時間:"+new Date());
            try {
                Thread.sleep(1000);//讓執行緒暫停1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

執行程式可以看到輸出每兩條字串之間的時間間隔為1秒。


2.執行緒讓步:yield()方法
該方法與sleep()類似,那為什麼又說是讓步呢?即是說當一個執行緒使用了這個方法之後,它就會把自己CPU執行的時間讓掉,讓自己或者其它的執行緒執行。API文件解釋的作用是暫停當前正在執行的執行緒物件,並執行其他執行緒。只是不能由使用者指定暫停多長時間,但它不會阻塞該執行緒,它只是將執行緒轉入就緒狀態,並且yield()方法只能讓同優先順序的執行緒有執行的機會。yield只是讓當前執行緒暫停一下,讓系統的執行緒排程器重新排程一次,但實際中無法保證yield()達到讓步目的,因為讓步的執行緒還有可能被執行緒排程程式再次選中。
程式碼演示:
package
jiangyiThread; public class YieldTest extends Thread{ public YieldTest(String name) { super(name); } public void run() { for(int i =0;i<50;i++) { System.out.println(getName()+" "+i); if(i==20) //當i=20時,使用yield()方法讓當前執行緒讓步 { Thread.yield(); } } } public static void main(String[] args) { // TODO Auto-generated method stub //啟動兩個併發執行緒 YieldTest yt1 = new YieldTest("高階"); //把yt1執行緒設定成最高優先順序 //yt1.setPriority(MAX_PRIORITY); yt1.start(); YieldTest yt2 = new YieldTest("低階"); //把yt2執行緒設定成最低優先順序 //yt2.setPriority(MIN_PRIORITY); yt2.start(); } }

執行程式:這裡寫圖片描述
(此時高階低階只是兩個執行緒的名字,它們優先順序完全一樣),我們可以看到“高階”和“低階”執行緒呼叫yield()之後將執行機會讓給優先順序相同的其他執行緒。
把設定優先順序的兩行程式碼註釋給弄掉,執行程式,結果如圖:這裡寫圖片描述
可以看出高優先順序的執行緒呼叫yield()方法暫停後,系統沒有與之優先順序相同或更高優先順序的執行緒,所以該執行緒繼續執行。
最後來個簡單的小結sleep()方法與yield()方法的作用:
sleep()方法 使當前執行緒的執行掛起一段指定的時間,把cpu時間讓給其他執行緒。時間可以由豪秒數或納秒數決定。

yield()方法 當前執行緒如果完成了所需的工作,可以暗示排程機制讓別的執行緒使用CPU了(這個暗示不一定保證被採用)