、sleep() wait() yeild()三者之間的區別?
2、當執行緒執行了sleep(long millis)方法後,將轉到阻塞狀態,引數millis指定睡眠時間;當執行緒執行了yield()方法後,將轉到就緒狀態。
3、sleep()方法宣告丟擲InterruptedException異常,而yield()方法沒有宣告丟擲任何異常
4、sleep()方法比yield()方法具有更好的移植性
5、當執行緒呼叫了自身的sleep()方法或其他執行緒的join()方法,就會進入阻塞狀態(該狀態既停止當前執行緒,但並不釋放所佔有的資源)。當sleep()結束或join()結束後,該執行緒進入可執行狀態,繼續等待os分配時間片;
6、當執行緒呼叫了yeild()方法,意思是放棄當前獲得的CPU時間片,回到可執行狀態,這時與其他程序處於同等競爭狀態,OS有可能會接著又讓這個程序進入執行狀態;
7、當執行緒剛進入可執行狀態(即就緒狀態),發現將要呼叫的資源被synchronized(同步),獲取不到鎖標記,將會立即進入鎖池狀態,等待獲取鎖標記(這時的鎖池裡也許已經有了其他執行緒在等待獲取鎖標記,這時它們處於佇列狀態,即先到先得)一旦執行緒獲得鎖標記後,就轉入可執行狀態,等待os分配CPU時間片;
8、當一個執行緒執行到wait()方法時,它就進入到一個和該物件相關的等待池中,同時失去了物件的鎖。它被一個notify()方法喚醒時,等待池中的執行緒就被放到鎖池中。該執行緒從鎖池中獲得鎖,然後回到wait()前的中斷現場。
9當執行緒呼叫wait()方法後會進入等待佇列(進入這個狀態會釋放所佔有的所有資源,與阻塞狀態不同),進入這個狀態後,是不能自動喚醒的,必須依靠其他執行緒呼叫notify()或notifyAll()方法才能被喚醒(wait(1000)時可以自動喚醒)(由於notify()只是喚醒一個執行緒。但我們由於不能確定具體喚醒的是哪一個執行緒,也許我們需要喚醒的執行緒不能夠喚醒,)因此在實際使用時,一般都用notifyAll(),方法喚醒所有執行緒(),當執行緒被喚醒後會進入鎖池,等待獲得鎖標記