天天看點

并發程式設計常用方法讓步:Thread.yield()方法休眠:Thread.sleep()加入:Thread.join()

讓步:Thread.yield()方法

與sleep方法的比較

當調用yield()時,對線程排程器的一種建議,它在聲明:我已經執行完生命周期中最重要的部分了,此刻正是切換給其他線程的大好時機

但是這完全是選擇性的,并非一定切換

yield()方法沒有聲明抛出任何異常

sleep()方法和yield()方法都是Thread類的靜态方法,都會使目前處于運作狀态的線程放棄CPU,把運作機會讓給别的線程。兩者的差別在于:

  • sleep()方法會給其他線程運作的機會,不考慮其他線程的優先級,是以會給較低優先級線程一個運作的機會;
  • yield()是在建議具有相同優先級的線程可以運作

當線程執行了sleep(long millis)方法,将轉到阻塞狀态,參數millis指定睡眠時間;當線程執行了yield()方法,将轉到就緒狀态。

sleep()方法比yield()方法具有更好的可移植性。不能依靠yield()方法來提高程式的并發性能。對于大多數程式員來說,yield()方法的唯一用途是在測試期間人為地提高程式的并發性能,以幫助發現一些隐藏的錯誤。

yield()方法是讓步,調用後會給線程排程器一個暗示,可以讓别的線程來使用cpu。但也僅僅是個暗示,沒有辦法保證這個暗示一定會被采納,隻是建議讓擁有相同優先級的其他線程運作

休眠:Thread.sleep()

使任務終止執行給定的時間

sleep()方法聲明抛出InterruptedException異常

在Java SE5中添加了更加顯示的sleep()方法版本,直接通過TimeUtil來指定休眠的時間機關,sleep(long timeout)調用會線程處于阻塞狀态

加入:Thread.join()

一個線程t在自己的run()内執行另外一個線程nt的nt.join()方法,t線程便會被挂起,nt線程結束後(nt.isAlive()為false)第一個線程t才會繼續執行

可在調用join()時帶上一個逾時參數,如此即使當目标線程nt在設定的逾時時間到期後還沒有結束,join()方法也會傳回

對其的調用可以被中斷