執行緒sleep和yield的區別
阿新 • • 發佈:2019-01-03
import java.util.Date;
//執行緒暫停
public class SleepTest {
public static void main(String[] args) throws Exception{
for (int i = 0; i < 10; i++) {
System.out.println("當前時間: "+new Date());
Thread.sleep(1000);
}
}
}
/*
* yield()方法也可以暫停當前正在執行的執行緒,但它不會阻塞該執行緒,它只是將該執行緒轉入就緒狀態
* yield()方法只是讓當前執行緒暫停一下,讓系統的執行緒排程器再次排程一次,完全可能的情況是:當某個執行緒
* 呼叫了yield()方法暫停之後,執行緒排程器又將其排程出來重新執行。
*/
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) {
Thread.yield();
}
}
}
public static void main(String[] args) throws Exception{
YieldTest yt1 = new YieldTest("高階");
yt1.setPriority(Thread.MAX_PRIORITY);
yt1.start();
YieldTest yt2 = new YieldTest("低階");
yt2.setPriority(Thread.MIN_PRIORITY);
yt2.start();
}
}
//sleep()方法和yield()方法的區別:
//1.sleep()方法暫停當前執行緒後會給其他執行緒執行機會,不理會優先順序,而yield()只給同優先順序或更高優先順序機會
//2.sleep()將執行緒轉入阻塞狀態,yield()將執行緒轉入就緒狀態
//3.sleep()方法宣告丟擲了InterruptedException異常,要麼捕獲該異常,要麼顯示宣告丟擲該異常,而yield()
//則沒有宣告丟擲任何異常
//4.sleep()比yield()有更好的移植性,通常不用yield來控制併發執行緒的執行