java線程常見的幾種方法


線程常見的幾種方法

標簽(空格分隔): 多線程


Thread靜態方法

1. Thread.sleep(misseconeds)
睡眠:當前線程暫停一段時間讓給別的線程去運行。Sleep復活時間,根據你傳入的睡眠時間而定,等到睡眠到規定的時間后,線程自動復活,它不會釋放鎖資源。
2. Thread.yield()
讓當前正在執行線程停下來一下,把執行機會讓給別的在等待的線程,自己回到等待的就緒隊列里面,自己也有可能會運行到,但更大的機會是讓別的等待線程運行,相當於將自己的優先級暫時降低一下,把機會讓給別人一會兒。

Thread實例方法

1. start方法

線程創建以后,並不會自動運行,需要我們手動的start,將線程的狀態設為就緒狀態,但不一定馬上就被運行,得等到CPU分配時間片以后,才會運行。

2. join方法

join方法,意思就是在自己當前線程加入你調用的線程,本線程則等待,當調用Joni的線程運行完了后,自己再去運行,t1和t2兩個線程,如果在t1線程里面調用了t2.join(),則t1線程會進行等待狀態,t2運行結束以后,才會繼續運行t1。這樣可以保證線程的先后順序。

3. wait方法(wait notify notifyAll都必須在持有有鎖的代碼中)

wait()是使當前線程阻塞,前提是必須先獲得鎖,一般配合到synchronized來使用,即,一般在synchronized 同步代碼塊里使用 wait()、notify/notifyAll() 方法,wait方法由當前所有的local對象里面調用,this.wait(),必須被try catch包圍,保證即使異常中斷也可以使wait等待的線程喚醒。執行了wait方法,需要被別的線程通過同一個對象的notify方法喚醒。

4. notify notifyAll

只有當 notify/notifyAll() 被執行時候,才會喚醒一個或多個正處於等待狀態的線程,然后繼續往下執行,直到執行完synchronized 代碼塊的代碼或是中途遇到wait() ,再次釋放鎖。也就是說,notify/notifyAll()的執行只是喚醒沉睡的線程,而不會立即釋放鎖,鎖的釋放要看代碼塊的具體執行情況。所以在編程中,盡量在使用了notify/notifyAll() 后立即退出臨界區,以喚醒其他線程讓其獲得鎖
notify 與 notifyAll區別
notify方法只喚醒一個等待(對象的)線程並使該線程開始執行。所以如果有多個線程等待一個對象,這個方法只會喚醒其中一個線程,選擇哪個線程取決於操作系統對多線程管理的實現。notifyAll 會喚醒所有等待(對象的)線程,盡管哪一個線程將會第一個處理取決於操作系統的實現。如果當前情況下有多個線程需要被喚醒,推薦使用notifyAll方法。比如在生產者-消費者里面的使用,每次都需要喚醒所有的消費者或是生產者,以判斷程序是否可以繼續往下執行。

5. yeild(不會釋放鎖資源,而讓當前線程從運行狀態回到就緒狀態)

調用yield方法會讓當前線程交出CPU權限,讓CPU去執行其他的線程。它跟sleep方法類似,同樣不會釋放鎖
但是yield不能立刻交出CPU,會出現同一個線程一直執行的情況,另外,yield方法只能讓擁有相同優先級的線程有獲取CPU執行時間的機會。
注意調用yield方法並不會讓線程進入阻塞狀態,而是讓線程重回就緒狀態,它只需要等待重新獲取CPU執行時間,這一點是和sleep方法不一樣的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM