Thread之wait和notify


二者應用:多線程通信 (由boolean值、wait( )和notify( )構成了多線程通信)

wait()方法:

 用法:線程調用wait()方法,釋放他對鎖的擁有權,然后等待另外的線程來通知他
        (通知的方式是notify()或者notifyAll()方法),這樣它才能重新獲得所的擁有權和恢復執行

    作用:wait()方法使得當前線程必須要等待,等到另外一個線程調用notify()或者notifyAll()方法。
    限制條件:要確保wait()方法的時候擁有鎖,即wait()方法的調用必須放在synchronized方法或者synchronized塊中

    與sleep區別:    
        當線程調用wait()方法時,它會釋放掉對象的鎖,sleep()睡眠不會釋放對象的鎖的

notify()方法:
    作用:notify()會喚醒一個等待當前鎖對象的線程。
    
    喚醒順序: 如果多個線程在等待(只能喚醒wait方法等待的線程),他們中的一個將會選擇被喚醒。這種選擇是隨意的(有jvm調度決定的)
          被喚醒的線程是不能被立即執行的,需要等到當前線程放棄這個對象的鎖
   
    使用方法:notify()方法應該是被擁有對象的鎖的線程所調用
    
    使用限制:notify方法調用和wait一樣必須放在synchronized方法或synchronized塊中,要求在調用時線程已經獲得對象的鎖

 被阻塞的線程和調用wait等待的線程:

  相同點:都經過鎖定區

 其實等待區(調用wait睡眠的線程)的線程 ,在通過notify/notifyAll方法的調用之后是進入鎖定區; 而 由於synchronized被阻塞的線程也是在鎖定區

  不同點:"優先級"不同

  這兩個根本就是一樣的,雖然都是睡眠的線程,但是一個是在門里(屋內喚醒),一個是在門外(屋外喚醒);可以理解成被喚醒的線程優先級較高一些

  切記:能進入運行態的只有就緒態了。而就緒態是在獲得鎖之后才能進入,(所以被喚醒的線程不是立馬進入就緒區,而是經過一次鎖定區,因為他被喚醒后還得等,喚醒它的那個線程執行結束)


免責聲明!

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



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