Java之sleep()方法與yield()方法的區別
阿新 • • 發佈:2019-01-26
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了(這個暗示不一定保證被採用)