1. 程式人生 > >執行緒sleep和yield的區別

執行緒sleep和yield的區別

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來控制併發執行緒的執行